【问题标题】:How to inject my database context into all my repository classes如何将我的数据库上下文注入我的所有存储库类
【发布时间】:2012-10-04 21:13:55
【问题描述】:

我的每个存储库类都如下所示:

public class ProfileRepository : IProfileRepository{

   private MyEntities myEnt = new MyEntities();
   ...

}

我正在像这样注入我的存储库类:

private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IProfileRepository>().To<ProfileRepository>();
            ....
            GlobalHost.DependencyResolver =  new NinjectDependencyResolver(kernel);
            GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator), () => new MyConnectionFactory());
            RouteTable.Routes.MapHubs(new NinjectDependencyResolver(kernel));
        }       

我想将 MyEntities 上下文注入到我的所有存储库类中,因此我在每个存储库类中都没有它的实例。我该如何做到这一点?这会是更好的做法吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 ninject


    【解决方案1】:

    首先,您最好使用Ninject.MVC3 包。它将为您节省将 Ninject 附加到框架中的负担,并且只会让您担心绑定。

    然后您可以使用 kernel.Bind&lt;your-database-context&gt;().ToSelf().InRequestScope().

    如果在同一个 MVC 请求中创建,这将确保您的所有存储库都将获得相同的 DbContext。

    注意:你不能在没有 Ninject.MVC3 的情况下使用 InRequestScope()。

    也就是说,我认为存储库是一个绝对糟糕的抽象。您需要经过许多环节来抽象出您的数据访问,仅用于单元测试。你最好不要抽象出你的数据访问(微软已经在实体框架方面做得很好),而只是为你的单元测试准备一个体面的数据库副本。 Django 为单元测试做了类似的事情,我想知道是否有一个单元测试系统可以自动处理这个(包括应用比 unit-test-only-database-snapshot 更新的迁移)。

    【讨论】:

    • 所以换句话说,我不应该将我的上下文注入到我的存储库中?
    • 如果您有存储库,则必须将上下文注入其中,并且必须确保每个请求只有一个上下文(实际上,这不是必须的,但它会让你的生活更轻松)。我是说 - 根本没有存储库,有更好的方法来完成单元测试。
    • @anthonypliu:你应该。通过不注入上下文,您将无法在不同场景中正确控制上下文的生命周期。
    【解决方案2】:

    我通过创建一个通用接口来实现这一点,即IMyEntitiesContext

    现在,我现在是凭记忆写的,所以这可能是也可能不是 100% 正确:

    类似这样的:

    public interface IMyEntitiesContext : IDisposable
    {
        IDbSet<Profile> Profiles { get; }
        ...
        ...
        int SaveChanges();
    }
    

    然后,更改您的 DbContext 类以实现此接口:

    public MyEntities : DbContext, IMyEntitiesContext
    {
        public IDbSet<Profile> Profiles { get; set; }
        ...
        ...
    }
    

    现在,您可以使用 IMyEntitiesContext 设置构造函数/属性注入:

    public ProfileRepository : IProfileRepository
    {
        private IMyEntitiesContext _ctx;
    
        public ProfileRepository(IMyEntitiesContext ctx)
        {
            _ctx = ctx;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多