【发布时间】:2011-08-24 01:58:15
【问题描述】:
规则“仅在 IoC 容器中存储服务。不要存储任何实体。”我在那个blog 中找到了它,它有很多支持者。
还有类构造函数的示例:
MyClass(ILog log,
IAudit audit,
IPermissions permissions,
IApplicationSettings settings) {/*..*/}
其中 MyClass 被宣布为不应存储在容器中的实体。
所以“IoC 就绪服务”不能依赖于基础设施......服务。
但现在我完全不明白“IoC 人”如何使用“真实代码”。 C#中的Service仍然会作为一个类来开发,并且该类通常依赖于封装日志的类,很少依赖于封装自定义异常处理的类(例如将未处理的异常转换为FaultContract)等......
我看到了一些方法: 可能他们只是没有声明那些基础设施依赖项?将它们用作静态方法中可用的功能?
或者可能是“IoC 支持者”认为“IoC 就绪”服务应该将 log/trace/authenticate/handleException 事件作为服务合同的一部分发布(然后是的——没有“对基础设施的依赖”)?但这也意味着这样的服务应该是双工的(发布日志事件)......
可能他们的“服务”只是代理?代理不依赖于基础设施,因为所有基础设施都是远程的,但我不高兴发现 IoC 容器应该只用于存储代理。我的失望是对的吗?但是,设计用于在 Unity 容器中处理记录器和处理程序的 MS 企业库呢?
追加:
我是这样理解的:有服务(有合同),有实体(业务),还有基础设施的东西 LogWriter、AuthenticationProvider;- 创建/托管服务我用一些基础设施的东西来启动它(所以我要发布依赖于基础设施而不是实体)。我仍然不明白我是否正确?
附加 2:
经过讨论,我这样理解情况。 ILog 等 - 是服务(即使它们是基础设施服务),因此如果“MyClass”是某些服务的实现,则不违反规则。这意味着规则是好的,但样本是坏的。
还有一个问题:一句话不解释,我还是不明白实体和服务的对立。它们来自不同的概念层:1)服务消息;和2)业务规则实体..所以可能首先我应该采用新的术语。
【问题讨论】:
-
感谢您的链接。情况对我来说要清楚得多:现在我确定 IoC 当然是关于基础设施建设,而不是关于商业实体建设。并且还想补充一点,在“仅存储服务;不存储任何实体”的规则中,服务和实体之间存在对立,这在教学上是错误的。
-
如果您采用领域驱动设计中提出的术语,服务和实体是完全不同的两个东西。我认为这没有错。当然,两者仍然是对象... :)
-
好的。我明白了,我的问题是我感觉不到上下文。对我来说,“服务”是 SOA 的概念。我们有来自 DDD 的“业务服务”。
-
不幸的是,“服务”这个词实在是太可怕了,以至于几乎毫无意义......
标签: c# inversion-of-control unity-container