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
问题的服务或依赖项时,您会很快发现。