3

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

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 上下文注入到我的所有存储库类中,因此我在每个存储库类中都没有它的实例。我该如何做到这一点?这会是更好的做法吗?

4

2 回答 2

3

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

然后您可以使用 kernel.Bind<your-database-context>().ToSelf().InRequestScope().

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

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

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

于 2012-10-04T21:21:07.310 回答
3

我通过创建一个通用接口来实现这一点,即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;
    }
}
于 2012-10-04T21:36:43.890 回答