我有以下内容;
interface IRepository
--interface IRepositoryEF: IRepository
--interface IRepositoryNH: IRepository
----interface ICategoryRepositoryEF: IRepositoryEF
----interface ICategoryRepositoryNH: IRepositoryNH
我想在服务中使用CategoryRepositoryEF
和CategoryRepositoryNH
类。如何将它们注入CategoryService?
CategoryService(IRepository repository)
{
}
关于此的最佳做法是什么?我可以使用RepositoryFactory
并将其注入服务,然后在服务中创建存储库吗?
我的意思是跟随;
CategoryService(CategoryRepositoryFactory factory)
{
var CategoryRepositoryEF = factory.Create("EF");
var CategoryRepositoryNH = factory.Create("NH");
}
这是个好主意吗?或者我完全错了?
答案 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>();
这只是一个例子,但考虑到应该在应用程序的组合根(入口点)注入依赖项。