更新:除了Windsor,有没有其他的IoC框架可以实现我要做的事情?Windsor可以很好地处理控制器,但无法解析其他任何内容。虽然我按照教程逐字逐句地操作,但对象未能通过ctor注入进行解析,它们仍为空。我已经放弃了DI代码,并手动注入以满足项目的时间敏感性。希望在截止日期之前能够解决DI问题。
我有一个解决方案,其中多个类都实现相同的接口。
作为一个简单的例子,是"Interface"。
具体类(The concrete classes)
现在,这些类将被注入到需要它们的上层图层中,例如:
两个控制器都会被注入相同的接口。
在使用IoC解析这些接口时,我如何区分
在IoC中如何将两个不同的具体类绑定到同一个接口? 我不想创建2个不同的接口,因为这违反了DRY规则,也没有意义。
在Castle Windsor中,我会有两行代码像这样:
这个方案行不通,因为我只会得到接口中最后一个注册的副本。就像我说的那样,如果为每个具体类创建特定接口,这样做不仅会违反DRY规则,而且会破坏基本的OOP原则。我该如何实现呢?
我有一个解决方案,其中多个类都实现相同的接口。
作为一个简单的例子,是"Interface"。
public interface IMyInterface {
string GetString();
int GetInt();
...
}
具体类(The concrete classes)
public class MyClassOne : IMyInterface {
public string GetString() {
....
}
public int GetInt() {
....
}
}
public class MyClassTwo : IMyInterface {
public string GetString() {
....
}
public int GetInt() {
....
}
}
现在,这些类将被注入到需要它们的上层图层中,例如:
public class HomeController {
private readonly IMyInterface myInterface;
public HomeController() {}
public HomeController(IMyInterface _myInterface) {
myInterface = _myInterface
}
...
}
public class OtherController {
private readonly IMyInterface myInterface;
public OtherController() {}
public OtherController(IMyInterface _myInterface) {
myInterface = _myInterface
}
...
}
两个控制器都会被注入相同的接口。
在使用IoC解析这些接口时,我如何区分
HomeController
需要一个 MyClassOne
实例,而 OtherController
需要一个 MyClassTwo
实例?在IoC中如何将两个不同的具体类绑定到同一个接口? 我不想创建2个不同的接口,因为这违反了DRY规则,也没有意义。
在Castle Windsor中,我会有两行代码像这样:
container.Register(Component.For<IMyInterface>().ImplementedBy<MyClassOne>());
container.Register(Component.For<IMyInterface>().ImplementedBy<MyClassTwo>());
这个方案行不通,因为我只会得到接口中最后一个注册的副本。就像我说的那样,如果为每个具体类创建特定接口,这样做不仅会违反DRY规则,而且会破坏基本的OOP原则。我该如何实现呢?
基于Mark Polsen答案的更新
这是我的当前IoC,在哪里放置.Resolve语句?我在Windsor文档中没有看到任何内容。
public class Dependency : IDependency {
private readonly WindsorContainer container = new WindsorContainer();
private IDependency() {
}
public IDependency AddWeb() {
...
container.Register(Component.For<IListItemRepository>().ImplementedBy<ProgramTypeRepository>().Named("ProgramTypeList"));
container.Register(Component.For<IListItemRepository>().ImplementedBy<IndexTypeRepository>().Named("IndexTypeList"));
return this;
}
public static IDependency Start() {
return new IDependency();
}
}
.Named(...)
方法的承诺是可以解决这种歧义,但实际使用中,我无法让Windsor解决任何问题 :-( - CD Smith