gpt4 book ai didi

c# - 如何实现通用 RepositoryFactory?

转载 作者:太空狗 更新时间:2023-10-29 19:41:52 24 4
gpt4 key购买 nike

我正在尝试实现通用存储库。这就是我到目前为止所得到的...

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 容器实现的依赖通常不是一个好主意。大多数时候,当我真的找不到方法让容器向我的对象注入(inject)依赖项时,我使用服务定位器模式,here您可以找到 .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<>))
);

然后像这样将它们注入(inject)到您的对象中:

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

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

关于c# - 如何实现通用 RepositoryFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com