5

鉴于下面的小例子,有没有办法在 中标记(属性,名称约定,...)MyInterface参数MyService2,以便它能够正确解析,或者是传入的唯一方法MyInterface[]?我知道 Castle Windsor 可以根据命名约定来解决它,但我在 DryIoc 中没有找到类似的东西

public interface MyInterface { }

public class MyImplementationA : MyInterface { }

public class MyImplementationB : MyInterface { }

public class MyService1
{
    public MyService1(MyInterface[] implementations) {
        Console.WriteLine(implementations.GetType().Name);
    }
}

public class MyService2
{
    public MyService2(MyInterface implementationA) {
        Console.WriteLine(implementationA.GetType().Name);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var c = new Container();
        c.Register<MyInterface, MyImplementationA>(serviceKey: "implementationA");
        c.Register<MyInterface, MyImplementationB>(serviceKey: "implementationB");

        c.Register<MyService1>();
        c.Register<MyService2>();

        var a = c.Resolve<MyService1>();
        var b = c.Resolve<MyService2>();
    }
}
4

2 回答 2

5

有多种方式:

首先使用您的评论中的服务密钥

这里消费者根据键选择依赖。

c.Register<MyService2>(made: Made.Of(() => 
    new MyService2(Arg.Of<MyInterface>(ServiceKeys.ImplementationA))));

更新:或以构造函数不可知的方式

c.Register<MyService2>(made:
    Parameters.Of.Type<MyInterface>(ServiceKeys.ImplementationA));

依赖条件

依赖根据条件选择消费者:

c.Register<MyInterface, MyImplementationA>(setup: Setup.With(
    condition: request => request.Parent.ServiceType == typeof(MyService2)));

在特定消费者的解析范围内重用依赖关系

它不再是瞬态的,但根据您的设置可能没问题。

c.Register<MyService2>(setup: Setup.With(openResolutionScope: true));
c.Register<MyInterface, MyImplementationA>(Reuse.InResolutionScopeOf<MyService2>());
于 2016-01-05T14:24:35.177 回答
1

你的注册没问题

c.Register<MyInterface, MyImplementationA>(serviceKey: "implementationA");
c.Register<MyInterface, MyImplementationB>(serviceKey: "implementationB");

如果要解析A 或 B的具体实例,可以通过以下方式更轻松:

var a = c.Resolve<MyInterface>(serviceKey: "implementationA");
var b = c.Resolve<MyInterface>(serviceKey: "implementationB");
于 2018-12-03T23:36:01.277 回答