使用serviceKey解决DryIoc中的子依赖性失败

时间:2017-11-01 17:07:33

标签: ioc-container dryioc

我想使用 serviceKey 来区分服务的不同实现。

代码说明:有一个ICat接口,用于“说出”猫的单词“Meow”。 “Meow”这个词来自ISoundProducer的实现(它被注入到ICat的实现中)。

我使用相同的serviceKey =“x”注册两个服务(ICat和ISoundProducer)。之后我尝试解析一个ICat实例,但它失败了。

以下是演示代码:

using DryIoc;
using System;

class Program
{
    static void Main(string[] args)
    {
        Container ioc = new Container();
        ioc.Register<ISoundProducer, GoodCatSoundProducer>(serviceKey: "x");
        ioc.Register<ICat, GoodCat>(serviceKey: "x");

        var c1 = ioc.Resolve<ICat>("x");
        c1.Say();

        Console.ReadKey();
    }
}

public interface ISoundProducer
{
    string ProduceSound();
}

public class GoodCatSoundProducer : ISoundProducer
{
    string ISoundProducer.ProduceSound() => "Meow";
}

public interface ICat
{
    void Say();
}

public class GoodCat : ICat
{
    private ISoundProducer _soundProducer;
    public GoodCat(ISoundProducer soundProducer) => this._soundProducer = soundProducer;
    void ICat.Say() => Console.WriteLine(_soundProducer.ProduceSound());
}

这给了我一个例外:

  

无法将ISoundProducer解析为参数“soundProducer”   GoodCat:来自容器的ICat {ServiceKey =“x”},正常和   动态注册:x,{ID = 28,ImplType = GoodCatSoundProducer}}

我做错了什么?如何使用另一个注入的服务解析服务,而它们都具有相同的serviceKey?

1 个答案:

答案 0 :(得分:2)

指定依赖关键字:

ioc.Register<ICat, GoodCat>(serviceKey: "x",
  made: Made.Of(Parameters.Of.Type<ISoundProducer>(serviceKey: "x")));
ioc.Register<ISoundProducer, GoodCatSoundProducer>(serviceKey: "x");