IoC, UnitOfWork with Ninject and Entity Framework

本文关键字:and Entity Framework Ninject with UnitOfWork IoC | 更新日期: 2023-09-27 17:58:06

我试图为我的服务类实现一个通用存储库。但是当我尝试在 Web 层中绑定我的 DbConext 时,我需要引用实体框架。

我的DbContext

  public partial class SalesDbContext : DbContext, IUnitOfWork
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
        public DbSet<Activity> Activities { get; set; }
        /// <summary>
        /// Allows saving changes via the IUnitOfWork interface.
        /// </summary>
        void IUnitOfWork.Commit()
        {
            base.SaveChanges();
        } 

我的IUnitOfWork

public interface IUnitOfWork
{
    /// <summary>
    /// Saves changes to all objects that have changed within the unit of work.
    /// </summary>
    void Commit();
}

我的Repository

public class Repository
{
    protected IUnitOfWork UnitOfWork { get; set; }
    protected SalesDbContext Context
    {
        get { return (SalesDbContext)this.UnitOfWork; }
    }
    public Repository(IUnitOfWork unitOfWork)
    {
        if (unitOfWork == null) throw new ArgumentNullException("unitOfWork");
        this.UnitOfWork = unitOfWork;
    }
    private DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class
    {
        return this.Context.Set<TEntity>();
    }
    protected IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
    {
        return this.GetDbSet<TEntity>()
            .AsEnumerable();
    }
    protected virtual void SetEntityState(object entity, EntityState entityState)
    {
        this.Context.Entry(entity).State = entityState;
    }
}

最后我的Ninject配置

private static void RegisterServices(IKernel kernel)
{
    IUnitOfWork unitOfWork = new SalesDbContext();
    kernel.Bind<IUnitOfWork>().ToConstant(unitOfWork);
    kernel.Bind<IMarketService>().To<MarketService>();
} 

问题是 Ninject 想要对实体框架的引用,但我不想在这里添加它,它属于数据层。

你认为 DbContext 的 ToConstant 实现会导致问题吗?

IoC, UnitOfWork with Ninject and Entity Framework

如果您不想从顶层(例如 Web(项目引用 EntityFramework,您将如何构建您的应用程序?顶级项目需要具有对所有基础依赖项的引用,以便在 Web 应用的情况下将它们放在bin文件夹中

绝对不是Ninject,谁想要那个参考。这是因为您使用的是类,而类依赖于该项目中的 EntityFramework。

从顶层(通过中间(到底层的引用没有问题。这可能是(设计(问题,如果是其他方式(例如,从数据层引用到System.Web(。

更新

正如OP在他的评论中所说。有一种可能的解决方案可以避免使用 ninject.extensions.xml 从顶层引用底层(如 EF(的依赖项。仅当意图是在顶层项目中进行 ninject 配置,但项目本身没有引用(使用(任何具有依赖项的底层类时,它才会起作用。此外,EF 必须在 GAC 中。


绑定

你的DbContext ToConstant()不是一个好概念,只要它实现了IDisposableDbContext应以尽可能短Scope对应用程序有意义的方式绑定(例如 InRequestScope()用于网络应用程序(。Ninject将在Scope结束时处理它。

如果DbContext绑定ToConstant,它将在整个应用程序生命周期中保持一个与数据库的连接。您可能会遇到并发问题,并且当由多个线程访问时,DbContext可能会变得不一致,因为它无法跟上对象同步。