将存储库注入服务?

时间:2013-08-28 11:48:24

标签: asp.net-mvc asp.net-mvc-4 service dependency-injection repository

我有以下内容;

interface IRepository
--interface IRepositoryEF: IRepository
--interface IRepositoryNH: IRepository
----interface ICategoryRepositoryEF: IRepositoryEF
----interface ICategoryRepositoryNH: IRepositoryNH 

我想在服务中使用CategoryRepositoryEFCategoryRepositoryNH类。如何将它们注入CategoryService?

CategoryService(IRepository repository)
{

}

关于此的最佳做法是什么?我可以使用RepositoryFactory并将其注入服务,然后在服务中创建存储库吗?

我的意思是跟随;

CategoryService(CategoryRepositoryFactory factory)
{
    var CategoryRepositoryEF = factory.Create("EF");
    var CategoryRepositoryNH = factory.Create("NH");
}

这是个好主意吗?或者我完全错了?

2 个答案:

答案 0 :(得分:2)

这个想法有点过时了。

存储库接口的目的是抽象出数据源。目标是允许所有使用类获取信息而不知道数据来自何处。但在你的情况下,你强迫类知道使用NHibernate或EntityFramework。为什么呢?

在创建特定接口时,我也没有IRepository接口。

现在的问题是“如何将nhibernate或实体框架存储库映射到我的某个接口”。

应该在应用程序启动时完成。你通常做这样的事情:

container.Register<ICategoryRepostitory, NHCategoryRepository>();
container.Register<IUserRepostitory, EFUserRepository>();

如果您不这样做,您可以有效地将使用代码与特定实现相结合。那时根本不需要任何接口。

<强>更新

  

如果我像[{1}}那样注入?

,会使用哪个存储库

您在控制容器的反转中注册的存储库。我的观点是,您不应该为每个存储库注册这两个实现,而只注册其中一个。

一个简单的例子如下。

首先使用web.config管理存储库类型:

CategoryService(ICategoryRepository repository)

然后在配置控件容器的反转时执行此操作:

<configuration>
  <appSettings>
    <add key="RepositoryType" value="NHibernate" />
  </appSettings>
</configuration>

答案 1 :(得分:1)

您可以将依赖项注入器用作Ninject并通过contructor注入参数

您的NinjectModule

public class NinjectModule : NinjectModule
{
    public override void Load() 
    {
        this.Bind<ICategoryRepositoryEF>().To<CategoryRepositoryEF>();
        this.Bind<ICategoryRepositoryNH >().To<CategoryRepositoryNH>();
        this.Bind<ICategoryService >().To<CategoryService>();
    }
}

注入依赖关系

var kernel = new StandardKernel(new NinjectModule());
var categoryService = kernel.Get<ICategoryService>();   

这只是一个例子,但考虑到应该在应用程序的组合根(入口点)注入依赖项。