如何解决使用Windsor的通用存储库生存期配置
|| 我不知道如何配置正确的Windsor容器以用于Windows应用程序中的存储库。 我有通用的存储库实现存储库,其中T是实体类型,它具有依赖项IDatacontextProvider,它为它提供数据上下文:public class Repository<T> : IRepository<T> where T : class
{
protected DataContext DataContext;
public Repository(IDataContextProvider dataContextProvider) {
DataContext = dataContextProvider.DataContext;
}
....
}
对于简单的事情,使用以下配置,一切正常。
container.Register(
Component.For<IDataContextProvider>()
.ImplementedBy<DataContextProvider>()
.Lifestyle.Transient,Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(Repository<>))
.Lifestyle.Transient,....
当我尝试从多个存储库加入不同的实体时,只要每个存储库实例具有不同的数据上下文实例,就会发生问题。
例如我有简单的服务:
public class SimpleService : ISimpleService {
public SimpleService(IRepository<Order>,IRepository<OrderLine>) {
....
}
}
我可以将IDataContextProvider设置为Singleton,但是我认为这会带来更大的问题。
我可以将IDataContextProvider传递给SimpleService,并尝试在那里解析存储库实例,但这将需要其他代码来使服务易于测试,并且还需要其他依赖项。
也许有人有一个更好的主意如何解决这个问题?
更新:
根据建议,我创建了存储库工厂(它与答案中的建议有点不同,它与datacontext没有直接的依赖关系,但是思想非常相似):
public interface IRepositoryFactory
{
IRepository<T> GetRepository<T>() where T:class;
}
public class RepositoryFactory : IRepositoryFactory
{
private readonly IDataContextProvider dataContextProvider;
public RepositoryFactory(IDataContextProvider dataContextProvider)
{
this.dataContextProvider = dataContextProvider;
}
public IRepository<T> GetRepository<T>() where T : class
{
return new Repository<T>(dataContextProvider);
}
}
解决方法
中间还有另一个层,例如RepositoryFactory,该怎么办?那可能是一种短暂的生活方式。从工厂创建的所有存储库将共享相同的DataContext实例。您还需要更改您的存储库类,以便它们采用DataContext实例而不是DataContextProvider。
public class RepositoryFactory : IRepositoryFactory
{
protected DataContext dataContext;
public RepositoryFactory(IDataContextProvider provider)
{
dataContext = dataContextProvider.DataContext;
}
public IRepository<T> GetRepository<T>()
{
return new Repository<T>(dataContext);
}
}
public class SimpleService : ISimpleService {
public SimpleService(IRepositoryFactory factory) {
....
}
}
,IDatacontextProvider
听起来像是工厂接口,通常在依赖项注入中定义为单例。我看到解决方案的几种潜在途径:
我不知道您的应用程序的详细信息,但也许您可以为5英镑编写自己的生活方式管理器(因为您说单身人士或暂住者都不适合您)。
如果要确保在存储库之间传递相同的“ 5”,则应该考虑将其明确地作为方法参数提供,而不是作为注入的依赖项提供。
@Can的答案也是一种可能的解决方案,我曾经用过一个。,您的问题在于生活方式的配置。我有同样的问题。您必须使用PerWebRequest生活方式配置存储库。这使我获得了不错的性能提升,并将错误从几十个减少到零。
在我的博客上,您可以找到一个简单的示例http://marcofranssen.nl,它首先与mvc3和EF Code结合使用。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。