我有一个Context对象。它是一个复杂的小字符,组成一个Auth对象,一个CurrentNode对象,一个Graph对象,以及其他一些对象。 Context对象有许多简单的方法,如isLoggedIn(
)和isAdmin()
,以及更复杂的方法,如hasPathToNode()
和netPathsToNode()
。大多数情况下,这些方法只是代理附加的对象。
Context对象位于我的Domain层中,即。我的应用程序堆栈的底部。它被所有层超级类型使用,包括Controller,View和Services。这看起来效果很好。
到目前为止,我还不需要使其他域对象依赖于Context。我的控制器或服务已经能够决定是否应该采取所请求的行动。但是,现在我有一个域对象特别复杂,并且严重依赖于Context中封装的逻辑。
我可以继续让这个域对象依赖于它的Context,但我的问题是我应该吗?该对象与Context在同一层,很好。 Context是一个单例,但是可以重置,因此很容易测试。
根据Martin Fowler关于服务层模式的POEAA讨论,逻辑“域逻辑”(与“应用逻辑”/“工作流逻辑”相对)属于域对象,因此鼓励我继续前进让依赖发生。
我意识到'耦合'一般是需要避免的。然而,在这种情况下,我将用层内耦合取代层间耦合,我认为这本身就是一种改进。最终我会使依赖注入,这将进一步减少耦合的缺点。
到目前为止,这是一个相当重要的偏离我的方法所以我想在做出改变之前找出你的想法。如果我继续使用这种依赖关系,我可能会重构我迄今为止所做的所有工作,并让其他域对象也依赖于它们的Context。
答案 0 :(得分:2)
我的观点是,这一切都取决于。你必须有一点实用主义,否则“正确”的解决方案可能比紧密耦合的解决方案痛苦10倍。您能否提供有关依赖Context对象的域对象的更多信息?依赖Context对象是根本还是特殊情况?也许上下文中的功能需要被分解到另一个类并与两者共享?也许你可以在Context对象上提供一些其他类可以挂钩的事件?在我看来,还没有足够的信息来进行这个电话。对于这些问题,没有一种尺寸适合所有解决方案。
答案 1 :(得分:2)
如果没有示例代码和实现,很难确定您的域是否应该依赖于上下文。但是,我已经完成了遗留代码的工作,遗留代码具有许多静态方法和上下文(例如配置)。我还开发了一个类来处理WPF中的所有基本操作(例如菜单栏和主选项卡面板)。结果,所有这些都难以重构,并且需要花费大量时间将其重新部署到另一个应用程序。
如果可用,我建议在域中构造函数注入上下文接口(而不是上下文本身),或者创建直接依赖项。如果难以使用/创建,请部署具有默认静态构建器的新层。例如:
public static class DomainContextCreator{
public static Domain DefaultDomain{
get{
IContext context = new Context();
Domain domain = new Domain(context);
return domain;
}
}
}
另外,你总是可以有一个包装类来处理一些上下文,比如静态属性,静态方法等;并使其注射和一般。您可以在codereview here找到实施示例。
如果您提供了代码实现示例,也许会有更好的答案。