Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将其他依赖项/配置注入修饰类_C#_.net_Dependency Injection_Simple Injector - Fatal编程技术网

C# 如何将其他依赖项/配置注入修饰类

C# 如何将其他依赖项/配置注入修饰类,c#,.net,dependency-injection,simple-injector,C#,.net,Dependency Injection,Simple Injector,我有一个I假设和一些设置实体。我知道对于这个实体,我需要一个缓存的存储库,所以我想创建一个ICachedRepositorydecorator,并用Simple Injector注册它 问题是我需要以某种方式将其他配置传递到缓存存储库,例如过期时间跨度、预取策略等 CachedRepository(IRepository repository, CachedRepositoryConfiguration configuration) { ... } 我该怎么做?(当然,对于不同的存储库,

我有一个
I假设
和一些
设置
实体。我知道对于这个实体,我需要一个缓存的存储库,所以我想创建一个
ICachedRepository
decorator,并用Simple Injector注册它

问题是我需要以某种方式将其他配置传递到缓存存储库,例如过期时间跨度、预取策略等

CachedRepository(IRepository repository, CachedRepositoryConfiguration configuration)
{
   ...
}

我该怎么做?(当然,对于不同的存储库,这些配置可能会有所不同,例如,一个存储库30分钟,另一个存储库1小时)

Simple Injector不允许您轻松配置装饰器的构造函数值(尽管这可以通过v2中的-or
IConstructorInjectionBehavior
完成)

解决此问题的最简单方法是回退到属性注入,并为每个装饰器注册一个初始值设定项:

公共类CachingRepositoryDecorator:IRepository
{
私人只读i存储装饰;
公共场所装修工(IRepository装修工){
this.decoree=decoree;
this.Configuration=CachedRepositoryConfiguration.noaching;
}
公共缓存位置配置{get;set;}
//我这里用的是假设方法。
}
容器注册检测器(类型(i存储),
类型(CachingRepositoryDecorator));
container.RegisterInitializer(decorator=>{
decorator.Configuration=
CachedRepositoryConfiguration.AbsoluteExpiration(TimeSpan.FromMinutes(30));
});
另一个选择是使用。使用文档中给出的扩展方法,您可以执行以下操作:

公共类CachingRepositoryDecorator:IRepository
{
私人只读i存储装饰;
专用只读缓存存储配置;
公共场所装修工,
缓存位置(配置){
this.decoree=decoree;
this.configuration=配置;
}
//我这里用的是假设方法。
}
容器注册检测器(类型(i存储),
类型(CachingRepositoryDecorator));
container.RegisterWithContext(context=>{
if(context.ImplementationType==typeof(CachingRepositoryDecorator)){
返回CachedRepositoryConfiguration.AbsExpiration(TimeSpan.FromMinutes(30));
}否则{
CachedRepositoryConfiguration.NoCaching;
}
});
第三个选项是使配置对象通用,如下所示:

公共类CachingRepositoryDecorator:IRepository
{
私人只读i存储装饰;
专用只读缓存存储配置;
公共场所装修工,
缓存位置(配置){
this.decoree=decoree;
this.configuration=配置;
}
//我这里用的是假设方法。
}
容器注册检测器(类型(i存储),
类型(CachingRepositoryDecorator));
container.RegisterSingleton(
CachedRepositoryConfiguration.Absolute(TimeSpan.FromMinutes(30));
container.RegisterSingleton(
缓存存储配置。滑动(时间跨度从分钟(5));
//将“无缓存”配置注册为回退
集装箱。登记(
类型(缓存存储配置),
类型(无机器缓存位置配置)。
生活方式(单身);
公共密封类NoCachedRepository配置
:CachedRepositoryConfiguration
{
public nocachGCachedRepositoryConfiguration():base(缓存:false){}
}

第三个选项允许您完全删除条件注册。

由于不同存储库的配置值本身可能不同,因此我将创建不同的类型,而不是重复使用相同的类型。或者,如果IoC库支持,您可以在“注入时”执行一些操作,但我认为这会使配置更加困难,我宁愿让IoC按照约定来确定。使用不同的类型会导致问题,因为存储库是泛型的。不幸的是,Simple Injector不支持开箱即用的“注入时”,尽管可以添加这种类型的功能。我想可能有一个更简单的方法来实现这一点。如果我使用“基于上下文的注入”,这对decorator不起作用吗?@IlyaChernomordik:是的,那会起作用。查看我的更新。是的,谢谢,我认为这比属性注入更好。@Ilyachernormodik:我添加了第三个选项。所以这不是容器的特定功能,但您使用泛型创建了多个设置类,所以这是解决问题的一种方法,对吗?