【发布时间】:2015-02-23 05:20:21
【问题描述】:
如果有人可以就为 ASP.NET MVC Web 应用构建正确的架构提供建议,我将不胜感激。
我正在开发MVC 5 网络应用程序,ADO.NET Entity Data Model 使用现有数据库。该应用程序主要使用CRUD操作。
我对我为达到松散耦合而尝试使用的设计模式存有疑问。我也想使用Ninject 依赖注入器。
所以,我的解决方案包括 3 个项目:Abstractions、MVCWebApplication 和 DAL。
我想获得有关构建Abstractions 项目的建议。
首先,我为我的数据库实体定义了视图模型。我不使用适配器模式,而是使用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 是什么意思?
非常感谢
【问题讨论】:
-
如果你正在构建一个 CRUD 应用程序,我可能会直接将 DbContext 注入控制器。为什么要使用所有抽象?或者为什么还要使用 MVC?只需使用 LightSwitch 构建一个应用程序。
-
我想使用更高级的工具并尝试为未来的项目扩展构建架构。
标签: asp.net asp.net-mvc dependency-injection ado.net ninject