与 Ninject、ASP.NET MVC 5 松散耦合的正确架构

Right architechture for loose coupling with Ninject, ASP.NET MVC 5

如果有人可以就为 ASP.NET MVC 网络应用程序构建正确的架构提出建议,我将不胜感激。

我正在开发 MVC 5 Web 应用程序,ADO.NET Entity Data Model 使用 现有数据库 。该应用程序主要使用CRUD操作。

我对我尝试使用以实现松散耦合的设计模式表示怀疑。我还想使用 Ninject 依赖注入器。

因此,我的解决方案包括 3 个项目:AbstractionsMVCWebApplicationDAL。 我想获得有关构建 Abstractions 项目的建议。

首先,我为我的数据库实体定义了视图模型。我不使用适配器模式,而是使用 AutoMapper 映射数据库和视图模型 类:

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 class 的问题是,当您需要另一个存储库(用于新实体)时,您将需要更改 UnitOfWork class(打破开闭原则)。

What is the sense of Ninject here?

我不确定我是否完全理解你的问题,Ninject 允许你在一个地方设置依赖项,然后在运行时将这些依赖项注入你的控制器或服务或任何使用的地方。