繁体   English   中英

解析为 null 而不是异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM