如何实现一个通用的RepositoryFactory?
我正在尝试实现一个通用存储库。这就是我到目前为止所得到的......
public interface IRepositoryFactory
{
IRepository<T> RepositoryOf<T>() where T : class;
}
public class EntityFrameworkRepositoryFactory : IRepositoryFactory
{
private readonly IWindsorContainer _container;
public EntityFrameworkRepositoryFactory(IWindsorContainer container)
{
_container = container;
}
public IRepository<T> RepositoryOf<T>() where T : class
{
var repository = _container.Resolve<IRepository<T>>();
return repository;
}
}
RepositoryFactory 由我的工作单元实现使用
public interface IUnitOfWork : IDisposable
{
IRepository<T> RepositoryOf<T>() where T : class;
void Commit();
}
无论如何,我想问的问题是 RepositoryFactory 实现依赖于 IWindsorContainer 是否正确?
我需要一种请求任何类型的 IRepository 的方法,所以我的安装程序代码执行此操作...
// Windsor Container
container.Register(
Component.For<IWindsorContainer>()
.Named("Container")
.Instance(container)
);
这似乎违背了 IoC 的整个概念,但也许请求存储库的整个想法确实做到了这一点。
编辑(作为对 miensol 的回答的回复)
我已经在使用 Windsor 创建存储库对我来说,在我的安装程序中使用以下代码...
// Generic Repository
container.Register(
Component.For(typeof (IRepository<>))
.ImplementedBy(typeof (EntityFrameworkRepository<>))
.ServiceOverrides(
ServiceOverride.ForKey("objectContext").Eq("ObjectContext"))
);
我过去曾使用 ServiceLocator 来实现我想要的目标,但读到它有点反模式。所以试图避免使用它。虽然我不得不承认我不确定为什么,因为我所做的似乎也是错误的,因为我必须使用 Castle Windsor 作为我的 IoC/DI 框架。服务定位器与框架无关。
所以,我有点困惑!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不完全确定为什么在使用 IoC 框架时需要 IRepositoryFactory。然而,对分散在代码库中的特定 IoC 容器实现的依赖通常不是一个好主意。大多数时候,当我确实找不到方法让容器将依赖项注入到我的对象时,我使用服务定位器模式,在这里您可以找到 .net 的常用实现。那么你的工厂方法将如下所示:
尽管如此,你似乎仍然可以让 Windsor 为你创建通用存储库:
并将它们注入到你的对象中,如下所示:
I'm not entirely sure why do you need
IRepositoryFactory
when you are using an IoC framework. However having dependencies to specific IoC container implementations scattered though the code base is generally not a good idea. Most of the time when I really can't find a way to make the container inject dependencies to my objects I use Service Locator Pattern, here you can find a commonly used implementation for .net. Then your factory method would look like this:Nevertheless it seems like you could just make Windsor create the generic repository for you anyways:
and having them injected to your objects like so: