[英]Resolve as null instead of an exception
在我们的一个项目中,我们有以下场景:我们有一个工厂,它使用它的工厂创建另一个包的服务(我们的工厂基本上配置了底层工厂)。 底层工厂使用流畅的语法,一个最小的例子如下所示:
public class SomeFactory<T> where T: class
{
private readonly IFooService _fooService;
private readonly IBarService<T> _barService;
private readonly IUnderlyingFactory _factory;
public SomeFactory(
IFooService fooService, IBarService<T> barService, IUnderlyingFactory factory)
{
_fooService = fooService,
_barService = barService,
_factory = factory
}
public SomeService<T> Create()
{
return _factory
.WithFooService(_fooService)
.WithBarService(_barService)
.Create();
}
}
现在手头的问题是:对于某些T
,我们已经实现了IBarService<T>
。 然而,底层包提供了一个默认实现(它是内部的,所以我们不能一般地注册它),我们想使用它,以防我们没有该T
的实现。 在这种情况下,我们根本不应该调用.WithBarService
方法。
但是,如果我们不注册IBarService<T>
,我们会从容器中收到一个异常,因为它无法解决它。
所以问题是:当容器无法为某些T
解析IBarService<T>
时,是否可以配置容器使其返回 null 而不是抛出? 或者有其他方法可以解决这个问题吗?
如果我们收到null
,我们可以将 Create 方法更改为:
public SomeService<T> Create()
{
var service = _factory.WithFooService(_fooService);
if (_barService != null){
_factory.WithBarService(_barService);
}
return _factory.Create();
}
为了完整BarService
,这就是我们为某些T
注册BarService
的方式,即通过对实现类型的反射:
container.RegisterMany(
ourAssembly.GetTypes()
.Where(type => type.GetInterfaces().Any(i => i.IsGenericType
&& !type.IsAbstract)));
当容器无法为某些 T 解析 IBarService 时,是否可以配置容器使其返回 null 而不是抛出? 或者有其他方法可以解决这个问题吗?
您可以将IBarService<T>
参数IBarService<T>
可选,如果服务未注册,则容器不会抛出:
public SomeFactory( IFooService fooService, IUnderlyingFactory factory,
IBarService<T> barService = null) { _fooService = fooService, _barService = barService, _factory = factory }
或者你可以配置服务注入IfUnresolved.ReturnDefault
选项。
container.Register(typeof(SomeFactory<>),
made: Parameters.Of.Type(typeof(IBarService<>), ifUnresolved: IfUnresolved.ReturnDefault))
注意:我可能会弄错最后一个的语法,但它应该是一致的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.