Entity framework 如何以简单的方式注入存储库?

Entity framework 如何以简单的方式注入存储库?,entity-framework,dependency-injection,ninject,asp.net-mvc-5,unit-of-work,Entity Framework,Dependency Injection,Ninject,Asp.net Mvc 5,Unit Of Work,我正在尝试获取work UnitOfWork、Ninject和Repository模式,目前我有以下代码: public class UnitOfWork : IUnitOfWork { private readonly MyContext context; public IGenericRepository<User> UserRepository { get; set; } public IGenericRepository<EmailChang

我正在尝试获取work UnitOfWork、Ninject和Repository模式,目前我有以下代码:

 public class UnitOfWork : IUnitOfWork
{
    private readonly MyContext context;

    public IGenericRepository<User> UserRepository { get; set; }
    public IGenericRepository<EmailChangesByUser> EmailChangesByUserRepository { get; set; }
    public IGenericRepository<PasswordChangesByUser> PasswordChangesByUserRepository { get; set; }
    public IGenericRepository<MyUserDataChanges> MyUserDataChangesByUserRepository { get; set; }
    public IGeoRepository GeoRepository { get; set; }
    public IFileManager FileManager { get; set; }

    public UnitOfWork(MyContext cont, IGenericRepository<User> userRepo,
        IGenericRepository<EmailChangesByUser> emailChangesByUserRepo,
        IGenericRepository<PasswordChangesByUser> passwordChangesByUserRepo,
        IGenericRepository<MyUserDataChanges> myUserDataChangesByUserRepo,
        IFileManager fileUploader, IGeoRepository geoRepo)
    { ... }
}
公共类UnitOfWork:IUnitOfWork
{
私有只读MyContext上下文;
公共IGenericRepository用户存储库{get;set;}
公共IGenericRepository EmailChangesBySerRepository{get;set;}
公共IGenericRepository密码更改ByUserRepository{get;set;}
公共IGenericRepository MyUserDataChangesBySerRepository{get;set;}
公共IGeoRepository地理位置{get;set;}
公共IFileManager文件管理器{get;set;}
公共工作单元(MyContext cont、IGenericRepository userRepo、,
IGenericRepository EmailChangesByserRepo,
IGenericRepository PasswordChangesBySerrepo,
IGenericRepository MyUserDataChangesBySerrepo,
IFileManager文件上传器,IGeoRepository geoRepo)
{ ... }
}
一切正常。但是我可以添加额外的依赖项,因此构造函数将非常胖。因此,我尝试以另一种方式做同样的事情(sumarized代码):

公共类UnitOfWork:IUnitOfWork
{
私有只读MyContext\u上下文;
私有哈希表存储库;
公共工作单元(MyContext上下文)
{
_上下文=上下文;
}
公共IRepository存储库(),其中tenty:ienty
{
如果(_==null)
{
_repositories=newhashtable();
}
var type=typeof(tenty).Name;
if(_repositories.ContainsKey(类型))
{
返回(IRepository)_存储库[类型];
}
_repositories.Add(…)//这是我的问题,有没有办法在这里注入REPOS
返回(IRepository)_存储库[类型];
}
}

我不知道我是否能正确地解释自己

你可以用不同的方法来处理这个问题。由于存储库和工作单元都是以抽象方式(通过接口)指定的,因此工作单元的具体实现应该创建具体的存储库实例:

public class EntityFrameworkUnitOfWork : IUnitOfWork
{
  private readonly MyContext context;

  private IGenericRepository<User> _userRepository 
  public IGenericRepository<User> UserRepository 
  { 
      get
      {
          if ( _userRepository == null )
             _userRepository = new EntityFrameworkUserRepository( this.context );
          return _userRepository;
      }
  }

  public UnitOfWork(MyContext cont)
  { 
      this.cotnext = cont;
  }
}

public class AnotherConcreteUnitOfWork : IUnitOfWork
{
  private readonly Something some;
  private readonly Another dependency;

  private IGenericRepository<User> _userRepository 
  public IGenericRepository<User> UserRepository 
  { 
      get
      {
          if ( _userRepository == null )
             _userRepository = new AnotherConcreteUserRepository( some, dependency );
          return _userRepository;
      }
  }

  public UnitOfWork(Something some, Another dependency)
  { 
      this.some = some;
      this.dependency = dependency;
  }
}
公共类EntityFrameworkUnitOfWork:IUnitOfWork
{
私有只读MyContext上下文;
专用IGenericRepository\u用户存储库
公共IGenericRepository用户存储库
{ 
得到
{
如果(_userRepository==null)
_userRepository=新EntityFrameworkUserRepository(this.context);
返回用户存储库;
}
}
公共工作单元(MyContext续)
{ 
this.cotnext=cont;
}
}
公共类另一个具体的工作单元:IUnitOfWork
{
私人只读一些东西;
私有只读另一个依赖项;
专用IGenericRepository\u用户存储库
公共IGenericRepository用户存储库
{ 
得到
{
如果(_userRepository==null)
_userRepository=新的另一个具体的userRepository(部分,依赖项);
返回用户存储库;
}
}
公共UnitOfWork(某些东西,另一个依赖项)
{ 
这个.一些=一些;
依赖性=依赖性;
}
}
因此,当您在实现之间切换时,您只指定工作单元的具体类型:

kernel.Bind<IUnitOfWork>().To<EntityFrameworkUnitOfWork>();
kernel.Bind().To();

kernel.Bind().To();

请注意,对于一组具体的存储库,使用一个具体的工作单元可以更容易地处理外部依赖关系,您必须首先将其注入到工作单元,然后再从那里注入到存储库(在上面的示例中,实体框架的工作单元依赖于dbcontext,而另一个工作单元依赖于其他对象).

谢谢!!你睁开了我的眼睛!!
kernel.Bind<IUnitOfWork>().To<EntityFrameworkUnitOfWork>();
kernel.Bind<IUnitOfWork>().To<AnotherConcreteUnitOfWork>();