【问题标题】:Right architechture for loose coupling with Ninject, ASP.NET MVC 5与 Ninject、ASP.NET MVC 5 松散耦合的正确架构
【发布时间】:2015-02-23 05:20:21
【问题描述】:

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

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

我对我为达到松散耦合而尝试使用的设计模式存有疑问。我也想使用Ninject 依赖注入器。

所以,我的解决方案包括 3 个项目:AbstractionsMVCWebApplicationDAL。 我想获得有关构建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


【解决方案1】:

我对您的方法的看法,它很好,并且有很多人在大型应用程序中使用它。所以不用担心。

一个建议,在您上面的代码中,您可以直接使用 IRepository 而不是使用 UnitOfWork.XXXRepository。您有通用存储库,它将适用于任何实体(客户、合同或新实体)

拥有 UnitOfWork 类的问题是,当您需要另一个存储库(用于新实体)时,您将需要更改 UnitOfWork 类(打破打开关闭原则)。

这里的Ninject是什么意思?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2010-12-14
    • 2011-02-03
    • 2020-10-26
    • 2011-02-22
    相关资源
    最近更新 更多