为多个接口注册相同的实现

J0H*_*0HN 2 c# inversion-of-control servicestack

我有一个实现多个接口的类

public class AwesomeThingClass: IAwesome<Thing>, IAwesomeThing {
    // parameterized constructor, so can't use RegisterAutowiredAs
    public AwesomeThingClass(IClient client, string connectionString) {} 
}
Run Code Online (Sandbox Code Playgroud)

它通过使用信号量封装了基数有限的多线程操作(我的意思是,只允许 N 个这样的操作同时运行)。

但是,如果我使用类似的东西向 IoC 注册它

container.Register<IAwesome<Thing>>(cont => new AwesomeThingClass(cont.Resolve<IClient>(), connStr))
container.Register<IAwesomeThing>(cont => new AwesomeThingClass(cont.Resolve<IClient>(), connStr))
Run Code Online (Sandbox Code Playgroud)

我最终得到了两个可以使用IAwesome<Thing>and解决的实例IAwesomeThing,它允许运行 2*N 操作。我绝对需要为两个接口解析相同的实例。除了手动实例化类和注册实例之外,还有什么方法可以实现这一点吗?

这个问题本质上类似于Register the same type to multiple links,但它并不是重复的,因为我正在使用 ServiceStack IoC 容器(Func在撰写本文时),而该问题是关于Unity

Dir*_*irk 5

可能有一个专门针对 ServiceStack IoC 的简单解决方案,但您也可以使用 aLazy<T>从两个 lambda 表达式返回相同的值。

var lazy = new Lazy<AwesomeThingClass>(() =>
    new AwesomeThingClass(container.Resolve<IClient>(), connStr));

container.Register<IAwesome<Thing>>(cont => lazy.Value);
container.Register<IAwesomeThing>(cont => lazy.Value);
Run Code Online (Sandbox Code Playgroud)

(我假设contlambda 的参数与变量是同一个对象container。)