【发布时间】:2015-08-05 19:42:36
【问题描述】:
我正在研究 IoC、DDD 和 AOP 概念。我已经阅读了许多文章、文档、Ninject 手册(我只能使用 .NET 3.5),尝试了一些东西等等。
很难一下子把所有事情都推到我的脑海里,但是动机、概念和技术问题都有些清楚了。而且我一直觉得我错过了一些东西。
首先,据我了解,IoC 容器的目的是设置初始对象结构?
例如,在组合根中设置容器,创建“主”对象,该对象一直由 IoC 容器连接。
然后,据我了解,后来所有对象都用工厂实例化了?虽然我无法帮助自己将工厂视为服务定位器的一个案例(最终被认为是反模式,顺便说一句,它被用作 IoC 容器的核心机制)。
所以问题是: 如果我想创建一个结构略有不同的实例怎么办,例如我有
interface IFoo{}
interface IBar{}
class SomeClass
{
SomeClass(IFoo obj){...}
}
class Foo : IFoo
{
Foo(IBar obj){...}
}
class Bar : IBar
{
}
class FooBar : IBar // also implements IBar interface
{
}
所以,初始绑定配置正在制作SomeClass.Foo.Bar 结构。假设,我还需要SomeClass.Foo.FooBar。我该怎么办?我能想到的选项:
“就地”重新配置绑定:只是没有。
有一个顶级类的构造函数参数,它具有整个结构的配置。这太可怕了。除了所有后续构造函数(以及所有其他项目类构造函数,最后,我敢肯定)将必须有一个更多参数这一事实之外,尚不清楚它将如何运行并且不使用一些肮脏的技巧。
-
在创建对象后替换所需的内容。它要么违反 demeter 法则(我不太关心,但在这种情况下它太粗鲁了)和其他一些原则,或者在一般情况下,根本不可能。
李> 使用以某种方式配置的工厂。它只是将需求本身推迟/转移到代码中的以后/其他地方
-
使用某种上下文/常规绑定。我看到的一个解决方案(尚未测试)是一直到“激活根”的顶部,检查是什么创建了层次结构。 m.b.我们必须为顶级类制作装饰器,以便容器检查其类型并做出相应的行为。实际上,容器可以以某种方式配置,它决定通过“解析”顶级接口的名称来注入什么具体实例。像
ICfg_ConcreteType1_ConcreteType2_...
这里的问题(除了看起来像 hack):
a) 我们必须引入一些助记系统,这不是淫秽/用户友好的。
b) 我们必须为每个具有此“功能”的工厂设置规则/装饰器(但看起来我们至少可以通过规则在某种程度上简化流程)
c) 它类似于我使用约定优于配置的反射用法,我已避免并将其视为 hack。
或者我们可以使用属性来设置它。或者可能是我什么都不知道。
【问题讨论】:
-
两个实现
IBar的目的是什么?合同不仅仅是方法签名。 -
@Matthew 当然,情况就是这样:相同的合约,其中一些合约的不同实现。以及几乎相似的对象,因此这些实现不同。我简直不敢相信这个问题很久以前就没有得到解决和解决。我一定是错过了什么,绝对
标签: c# dependency-injection inversion-of-control factory