如果有人能为ASP.NET MVC web应用程序构建正确的体系结构提供建议,我将不胜感激。
我目前正在MVC 5
web应用程序上工作,ADO.NET Entity Data Model
使用现有数据库。该应用程序主要使用CRUD操作。
我怀疑我试图使用的设计模式,以达到松散耦合。我还想使用Ninject
依赖项注入器。
因此,我的解决方案包括3个项目:Abstractions
、MVCWebApplication
和DAL
。我想得到关于Abstractions
项目结构的建议。
首先,我定义了数据库实体的视图模型。我不使用Adapter模式,而是使用AutoMapper
来映射DB和View模型类:
namespace MVCWebApplication.Models
{
public class CustomerVM
{
public int ID {get; set;}
public string Name {get; set;}
public Contract Contract {get; set;}
}
public class ContractVM
{
public string ContractNo {get; set;} //ID
pulic DateTime AgreementDate {get; set;}
}
}
通用存储库
namespace Abstractions
{
public interface IRepository<T>
{
T Find(object pk);
IQueryable<T> GetAll();
void Insert(T entity);
//...
}
public class Repository<T> : IRepository<T> where T : class
{
public DbContext context;
public DbSet<T> dbset;
public Repository(DbContext context)
{
this.context = context;
dbset = context.Set<T>();
}
//implementation
}
}
UnitOfWork让我可以访问存储库:
namespace Abstractions
{
public interface IUnitOfWork : IDisposable
{
IRepository<Customer> CustomerRepository { get; } //Customer is DB entity
IRepository<Contract> ContractRepository { get; } //Contractis DB entity
//other repositories
void Save();
}
public partial class UnitOfWork : IUnitOfWork
{
private IRepository<Customer> _customerRepository;
private IRepository<Contract> _contractRepository;
private CREntities _context;
public UnitOfWork()
{
_context = new CREntities();
}
public IRepository<Customer> CustomerRepository
{
get
{
if (_customerRepository == null)
_customerRepository = new Repository<Customer>(_context);
return _customerRepository;
}
}
//other repositories, save & dispose ..
}
}
在App_Start
中,我有:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<UnitOfWork>();
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
}
那么,我的问题是,这种方法是权宜之计吗?这里的Ninject是什么意思?
非常感谢
我对您的方法的看法很好,有很多人在大型应用程序中使用它。所以不用担心。
一个建议是,在您的上述代码中,您可以直接使用IRepository,而不是使用UnitOfWork.XXXRepository。您得到了通用存储库,它可以与任何实体(客户、合同或新实体)一起工作
使用UnitOfWork类的问题是,当您需要另一个存储库(用于新实体)时,您将需要更改UnitOfWork类别(打破打开-关闭原则)。
这里的Ninject是什么意思?
我不确定我是否完全理解你的问题,Ninject允许你在一个地方设置依赖项,然后在运行时将这些依赖项注入你的控制器或服务或任何使用的地方。