【发布时间】:2017-09-28 13:48:19
【问题描述】:
我有以下代码:
interface IService
{
void Execute();
}
class ServiceA : IService
{
public void Execute() { ... }
}
class ServiceB : IService
{
public void Execute() { ... }
}
class ServiceComposite : IService
{
List<IService> _services = new List<IService>();
public ServiceComposite()
{
_services.Add(new ServiceA());
_services.Add(new ServiceB());
}
public void Execute()
{
foreach (IService service in _services)
{
service.Execute();
}
}
}
问题在于ServiceB 依赖于ServiceA 的一些结果。我的想法是创建容器类来存储结果,然后将其注入到 ServiceA 和 ServiceB 中:
class ServiceResults
{
public string SomeProperty {get; set;}
}
public ServiceComposite()
{
ServiceResults result = new ServiceResults();
_services.Add(new ServiceA(result));
_services.Add(new ServiceB(result));
}
我想知道这是否是解决问题的最佳方法。也许它违反了一些我不知道的原则或规则,或者只是“代码味道”。有什么更好的方法来做到这一点?
【问题讨论】:
-
我很想知道为什么
B需要来自A的结果 - 如果是这样的话,将它们视为两个单独的实现似乎是不正确的。 -
或者服务 A 可以将结果作为属性公开,并将服务 A 作为服务 B 的依赖项传递
-
您实际上也没有在这里实现“复合”模式。
-
@Servy,你为什么这么说?
-
@jaco0646 一个实例组成两个特定的其他实现不同于一般地组成任意数量的任何类型的对象,包括那些本身可以与其他对象组合的对象,这些对象本身可以与其他对象组合对象等。复合模式是树的表示,这不能表示任何树。
标签: c# design-patterns composite design-principles