servicestack,inversion-of-control,C#,servicestack,Inversion Of Control" /> servicestack,inversion-of-control,C#,servicestack,Inversion Of Control" />

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

C# 为多个接口注册相同的实现,c#,servicestack,inversion-of-control,C#,servicestack,Inversion Of Control,我有一个实现了许多接口的类 public class AwesomeThingClass: IAwesome<Thing>, IAwesomeThing { // parameterized constructor, so can't use RegisterAutowiredAs public AwesomeThingClass(IClient client, string connectionString) {} } 公共类Awesomething类:IAwe

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

public class AwesomeThingClass: IAwesome<Thing>, IAwesomeThing {
    // parameterized constructor, so can't use RegisterAutowiredAs
    public AwesomeThingClass(IClient client, string connectionString) {} 
}
公共类Awesomething类:IAwesome,IAwesomeThing{
//参数化构造函数,因此无法使用RegisterAutowiredAs
公共AwesomeThingClass(IClient客户端,字符串连接字符串){}
}
它使用信号量以有限的基数封装多线程操作(我的意思是,只有N个这样的操作可以同时运行)

但是,如果我使用类似于

container.Register<IAwesome<Thing>>(cont => new AwesomeThingClass(cont.Resolve<IClient>(), connStr))
container.Register<IAwesomeThing>(cont => new AwesomeThingClass(cont.Resolve<IClient>(), connStr))
container.Register(cont=>newawesomethingclass(cont.Resolve(),connStr))
container.Register(cont=>newawesomethingclass(cont.Resolve(),connStr))
我最终得到了两个实例,它们可以使用
IAwesome
IAwesomeThing
来解决,这两个实例允许运行2*N个操作。我肯定需要为两个接口解析相同的实例。除了手动实例化类和类之外,还有其他方法可以实现这一点吗


这个问题本质上类似于,但不是重复的,因为我使用的是ServiceStack IoC容器(
Func
),虽然这个问题是关于统一的,但是可能有一个专门针对ServiceStack IoC的简单解决方案,但是您也可以使用一个
Lazy
从两个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);
var lazy=new lazy(()=>
新的AwesomeThingClass(container.Resolve(),connStr));
container.Register(cont=>lazy.Value);
container.Register(cont=>lazy.Value);

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

可能有一个专门用于ServiceStack IoC的简单解决方案,但您也可以使用
Lazy
从两个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);
var lazy=new lazy(()=>
新的AwesomeThingClass(container.Resolve(),connStr));
container.Register(cont=>lazy.Value);
container.Register(cont=>lazy.Value);

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

您应该能够强制转换它:

container.Register<IAwesomeThing>(c => 
    new AwesomeThingClass(c.Resolve<IClient>(), connStr));

container.Register(c => (IAwesome<Thing>) c.Resolve<IAwesomeThing>()));
container.Register(c=>
新的AwesomeThingClass(c.Resolve(),connStr));
Register(c=>(IAwesome)c.Resolve());

您应该可以直接将其转换为:

container.Register<IAwesomeThing>(c => 
    new AwesomeThingClass(c.Resolve<IClient>(), connStr));

container.Register(c => (IAwesome<Thing>) c.Resolve<IAwesomeThing>()));
container.Register(c=>
新的AwesomeThingClass(c.Resolve(),connStr));
Register(c=>(IAwesome)c.Resolve());

谢谢你的回答。不幸的是,它本质上与手动实例化类相同。主要的问题是,使用实例注册时依赖项不是自动连接的,这只是延迟的实例注册。@J0HN但是您想如何避免插入自定义参数(
connStr
)。这似乎对自动布线根本不起作用。可能是我不理解某些东西,或者文档不清楚,但似乎使用仍然会触发自动布线。谢谢您的回答。不幸的是,它本质上与手动实例化类相同。主要的问题是,使用实例注册时依赖项不是自动连接的,这只是延迟的实例注册。@J0HN但是您想如何避免插入自定义参数(
connStr
)。这似乎对自动连接根本不起作用。可能是我不理解某些东西,或者文档不清楚,但使用仍然会触发自动连接。感谢您的回答,它可以工作,但问题是我们没有进行编译时类型检查。这是一个很好的解决方法,但是如果某个AwesomeThingClass不再实现
IAwesome
@J0HN,那么可能会导致运行时错误。如果它找不到实现这两个接口的类型,您仍然会得到
可疑强制转换
警告(来自VS.NET或R#)。否则,当您尝试使用能够解决
IAwesome
问题的服务或依赖项时,您会很快发现问题。感谢您的回答,它是有效的,但这里的问题是我们放松了编译时类型检查。这是一个很好的解决方法,但是如果某个AwesomeThingClass不再实现
IAwesome
@J0HN,那么可能会导致运行时错误。如果它找不到实现这两个接口的类型,您仍然会得到
可疑强制转换
警告(来自VS.NET或R#)。否则,当您尝试使用解决
IAwesome
问题的服务或依赖项时,您会很快发现。