Generics DryIoC基于泛型类型参数将参数传递给开放泛型服务的构造函数

Generics DryIoC基于泛型类型参数将参数传递给开放泛型服务的构造函数,generics,dryioc,Generics,Dryioc,假设我有这项服务和两种策略: public class SomeService<TEntity> : ISomeService<TEntity> { public SomeService(ICurrentDbContext context, IStrategy<TEntity>? delete = null) : base(context, delete ?? new DefaultStrategy<TEntity>())

假设我有这项服务和两种策略:

public class SomeService<TEntity> : ISomeService<TEntity>
{
    public SomeService(ICurrentDbContext context, IStrategy<TEntity>? delete = null)
         : base(context, delete ?? new DefaultStrategy<TEntity>())
        {}
}

public class DefaultStrategy<TEntity> : IStrategy<TEntity> {}

public class CustomStrategy<TEntity> : IStrategy<TEntity> {}
公共类SomeService:ISomeService
{
公共SomeService(ICurrentDbContext上下文,IStrategy?delete=null)
:base(上下文,删除??新建DefaultStrategy())
{}
}
公共类默认策略:IStStrategy{}
公共类定制策略:IStrategy{}
我当前的服务注册如下所示:

container.Register(typeof(ISomeService<>), typeof(SomeService<>), Reuse.Transient);
container.Register(typeof(isomservice)、typeof(SomeService)、Reuse.Transient);
这里我想要实现的是,如果泛型类型参数T实现了一些接口,比如说IFoo,则在ISomeService的解析尝试上传递CustomStrategy。否则,将其保留为默认值为null的参数

Ofc在这两种情况下,第一个参数都应作为已注册的依赖项自动解析

现在我不知道该怎么做,我应该使用拦截器吗?

你可以这样做(但你的问题不清楚为什么你有两种策略
DefaultStrategy
CustomStrategy

使用System.Linq;
使用NUnit.Framework;
命名空间DryIoc.issuests
{
[测试夹具]
公共类SO_DryIoC_根据_generic_type_参数将_参数传递给_open_generic_service_的_构造函数_
{
[测试]
公开无效测试()
{
var container=新容器();
container.Register(typeof(isomservice)、typeof(SomeService)、Reuse.Transient、,
制造:详细信息的参数((要求,p)=>
p、 ParameterType.GetGenericDefinitionOrNull()==typeof(IstStrategy)和
p、 ParameterType.GetGenericParamsAndArgs().Any(x=>x.IsAssignableTo())
?null//默认注入行为
:ServiceDetails.Of(value:null))//否则返回'null'值
);
container.Register();
容器寄存器(typeof(IStrategy),typeof(DefaultStrategy));
var s1=container.Resolve();
Assert.IsNull(((SomeService)s1.Delete);
var s2=container.Resolve();
Assert.IsNotNull(((SomeService)s2.Delete);
}
公共接口服务{}
公共类SomeService:ISomeService
{
公共只读策略删除;
公共SomeService(ICurrentDbContext上下文,IStrategy delete=null)=>delete=delete;
}
公共接口IFoo{}
公共类footentity:IFoo{}
公共类OtherEntity{}
公共接口策略{}
公共类默认策略:IStStrategy{}
公共类定制策略:IStrategy{}
公共接口ICurrentDbContext{}
公共类MyDbContext:ICurrentDbContext{}
}
}

谢谢你的回答。看来这就是我要找的。当我应用该规则时,第一个参数ICurrentDbContext将不可能为null。关于你的问题——假设我有一个由接口标记的实体,它表示我需要使用一个服务,该服务提供一些自定义策略来处理逻辑;否则(对于所有未标记的实体,我需要使用具有默认行为的策略)。如果你需要更多的细节,我会提供一个真实的例子。解决了!谢谢!