繁体   English   中英

如何实现一个通用的RepositoryFactory?

[英]How to implement a generic 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框架,所以我所做的事情似乎也是错误的。 服务定位器旨在与框架无关。

所以,我有点困惑!

我不确定要使用IoC框架时为什么需要IRepositoryFactory 但是,通过代码库分散对特定IoC容器实现的依赖性通常不是一个好主意。 大多数时候,当我真的找不到使容器向我的对象注入依赖项的方法时,我在这里使用服务定位器模式, 在这里您可以找到.net的常用实现。 然后,您的工厂方法将如下所示:

public IRepository<T> RepositoryOf<T>() where T : class
{
  return ServiceLocator.Current.GetInstance<IRepository<T>>();
}

尽管如此,似乎您仍然可以使Windsor为您创建通用存储库:

container.Register(
  Component.For(typeof(IRepository<>)).ImplementedBy(typeof(GenericRepositoryImplementation<>))
);

并将它们注入到您的对象中,如下所示:

public class ClassThatRequiresSomeRepos
{
  IRepository<OneEntity> repoOne;
  IRepository<TwoEntity> repoTwo;

  public ClassThatRequiresSomeRepos(IRepository<OneEntity> oneEntityRepository, IRepository<TwoEntity> twoEntityRepository)
  {
    _repoOne = oneEntityRepository;
    _repoTwo = twoEntityRepository;
  }
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM