0

我有以下;

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

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

CategoryService(IRepository repository)
{

}

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

我的意思是如下;

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

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

4

2 回答 2

2

这个想法有点偏离。

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

当您创建特定的接口时,我也不会有IRepository接口。

现在的问题是“如何将休眠或实体框架存储库映射到我的接口之一”。

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

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

如果你不这样做,你已经有效地将使用代码与特定实现耦合在一起。那时真的根本不需要任何接口。

更新

如果我像注入一样使用哪个存储库CategoryService(ICategoryRepository repository)

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

下面是一个简单的例子。

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

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

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

if (ConfigurationManager.AppSettings["RepositoryType"] == "NHibernate"))
{
    _autofac.RegisterType<NHCategoryRepository>.As<ICategoryRepository>();
    _autofac.RegisterType<NHUserRepository>.As<IUserRepository>();
}
else
{
    _autofac.RegisterType<EFCategoryRepository>.As<ICategoryRepository>();
    _autofac.RegisterType<EFUserRepository>.As<IUserRepository>();
}
于 2013-08-28T12:03:08.083 回答
1

您可以使用依赖注入器作为Ninject并通过构造函数注入参数

你的 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>();   

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

于 2013-08-28T11:59:50.330 回答