如何实现通用的RepositoryFactory?
我正在尝试实现一个通用存储库。 这是我到目前为止所得到的……
public interface IRepositoryFactory { IRepository RepositoryOf() where T : class; } public class EntityFrameworkRepositoryFactory : IRepositoryFactory { private readonly IWindsorContainer _container; public EntityFrameworkRepositoryFactory(IWindsorContainer container) { _container = container; } public IRepository RepositoryOf() where T : class { var repository = _container.Resolve<IRepository>(); return repository; } }
RepositoryFactory由我的工作单元实现使用
public interface IUnitOfWork : IDisposable { IRepository RepositoryOf() where T : class; void Commit(); }
无论如何,我想问的问题是,RepositoryFactory实现依赖于IWindsorContainer是否正确?
我需要一种方法来询问任何类型的IRepository,所以我的安装程序代码执行此操作…
// Windsor Container container.Register( Component.For() .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框架。 服务定位器旨在与框架无关。
所以,我有点困惑!
我不完全确定为什么在使用IoC框架时需要IRepositoryFactory
。 但是,通过代码库分散对特定IoC容器实现的依赖性通常不是一个好主意。 大多数时候,当我真的找不到让容器为我的对象注入依赖项的方法时,我使用Service Locator Pattern, 在这里你可以找到一个常用的.net实现。 那么你的工厂方法将如下所示:
public IRepository RepositoryOf () where T : class { return ServiceLocator.Current.GetInstance>(); }
尽管如此,您似乎可以让Windsor为您创建通用存储库:
container.Register( Component.For(typeof(IRepository<>)).ImplementedBy(typeof(GenericRepositoryImplementation<>)) );
并将它们注入您的对象,如下所示:
上述就是C#学习教程:如何实现通用的RepositoryFactory?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public class ClassThatRequiresSomeRepos { IRepository repoOne; IRepository repoTwo; public ClassThatRequiresSomeRepos(IRepository oneEntityRepository, IRepository twoEntityRepository) { _repoOne = oneEntityRepository; _repoTwo = twoEntityRepository; } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/962396.html