【问题标题】:Resolving named services in DryIoc DI-Container解析 DryIoc DI-Container 中的命名服务
【发布时间】:2021-04-15 18:07:40
【问题描述】:

考虑以下两个类:

public class Number
{
    public int Value { get; set; }
}

public class Multiplier
{
    private readonly Number first;
    private readonly Number second;

    public Multiplier(Number first, Number second)
    {
        this.first = first;
        this.second = second;
    }

    public int Multiply() => this.first.Value * this.second.Value;
}

Multiplier 类依赖于 Number 的两个实例。我想使用 DryIoc DI 容器将它们作为 命名服务 注入。执行此操作的代码如下所示:

var container = new Container();

container.RegisterInstance(new Number{Value = 2}, serviceKey:"first");
container.RegisterInstance(new Number{Value = 4}, serviceKey:"second");
container.Register<Multiplier>();

var consumer = container.Resolve<Multiplier>();

Console.WriteLine(consumer.Multiply());

此代码失败并出现 DryIoc.ContainerException(在调用 Resolve 时),因为已注册的实例无法解析为构造函数参数。我的问题基本上是:有什么方法可以让我指定应该将哪个命名的 serviceKey 解析为哪个构造函数参数?

在 MEF 中,我将执行以下操作来实现此目的:

[Export(typeof(Multiplier))]
public class Multiplier
{
    private readonly Number first;
    private readonly Number second;

    [ImportingConstructor]
    public Multiplier([Import("first")]Number first, 
                      [Import("second")]Number second)
    {
        this.first = first;
        this.second = second;
    }

    public int Multiply() => this.first.Value * this.second.Value;
}

然后使用服务名称导出依赖项:

var container = new CompositionContainer(someCatalog);
container.ComposeExportedValue("first", new Number{Value = 2});
container.ComposeExportedValue("second", new Number{Value = 4});

var multi = container.GetExport<Multiplier>();

如何使用 DryIoc 做到这一点?

【问题讨论】:

    标签: c# dependency-injection mef dryioc


    【解决方案1】:

    首先,您可以使用 DryIoc.MefAttributedModel.dll 扩展名重复使用相同的 MEF 代码。

    单独使用DryIoc,需要指定参数名称(或Type,或位置)与servicKey的映射关系:

    var container = new Container();
    
    container.RegisterInstance(new Number {Value = 2}, serviceKey:"first");
    container.RegisterInstance(new Number {Value = 4}, serviceKey:"second");
    
    container.Register<Multiplier>(made: Parameters.Of
        .Name("first",  serviceKey: "first")
        .Name("second", serviceKey: "second"));
    
    var consumer = container.Resolve<Multiplier>();
    

    更多详情:https://github.com/dadhi/DryIoc/blob/master/docs/DryIoc.Docs/SpecifyDependencyAndPrimitiveValues.md#complete-example-of-matching-the-parameter-name-to-the-service-key

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多