更新:有没有办法在 Windsor 以外的 IoC 框架中实现我想要做的事情?Windsor 会很好地处理控制器,但不会解决其他任何问题。我确定这是我的错,但我正在逐字遵循教程,并且对象没有通过 ctor 注入解析,尽管进行了注册和解析,它们仍然为空。我已经废弃了我的 DI 代码并暂时进行手动注入,因为该项目对时间很敏感。希望在截止日期前完成 DI。
我有一个解决方案,它有多个类都实现了相同的接口
举个简单的例子,Interface
public interface IMyInterface {
string GetString();
int GetInt();
...
}
具体类
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 规则并且无论如何都没有意义。
在温莎城堡中,我会有 2 行这样的:
container.Register(Component.For<IMyInterface>().ImplementedBy<MyClassOne>());
container.Register(Component.For<IMyInterface>().ImplementedBy<MyClassTwo>());
这行不通,因为我只会得到一个副本,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();
}
}