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
可能有一个专门针对 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。)