复合设计模式:如何将结果从一个组件传递到另一个组件?

我有以下代码:

interface IService { void Execute(); } class ServiceA : IService { public void Execute() { ... } } class ServiceB : IService { public void Execute() { ... } } class ServiceComposite : IService { List _services = new List(); 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)); } 

我想知道这是否是解决问题的最佳方法。 也许它打破了我不知道的一些原则或规则,或者仅仅是“代码味道”。 有什么更好的方法呢?

如果ServiceB需要ServiceA的结果才能正常运行,那么为什么ServiceB依赖于ServiceA

 public interface IService { void Execute(); } public class ServiceA : IService { public void Execute() { ... } } class ServiceB : IService { public ServiceB(IService service) { Service = service; } public void Execute() { ... } public IService Servie { get; set; } } 

然后,如果您在集合中执行所有Service ,则可以添加ServiceBase以确保此服务仅执行一次:(完整示例)

在这个基本实现中,您可以添加:Async Execute ,执行InnerExecute ,Flyweight工厂的线程安全检查,用于生成特定的IService ,为每个Service提供一个带有派生响应的ResponseBase ….

 public class ServiceResponse { } public interface IService { ServiceResponse Execute(); } public abstract class ServiceBase : IService { public ServiceResponse Execute() { if (_response == null) { _response = InnerExecute(); } return _response; } public abstract ServiceResponse InnerExecute(); private ServiceResponse _response; } public class ServiceA : ServiceBase { public override ServiceResponse InnerExecute() { return new ServiceResponse(); } } public class ServiceB : ServiceBase { public ServiceB(IServiceFactory serviceFactory) { ServiceFactory= serviceFactory; } public override ServiceResponse InnerExecute() { return ServiceFactory.GetServices(ServicesTypes.ServiceA).Execute(); } public IServiceFactory ServiceFactory { get; set; } } 

无论谁使用这些Service

 public enum ServicesTypes { ServiceA, ServiceB.... } public interface IServiceFactory { IEnumerable GetServices(); IService GetServices(ServicesTypes servicesTypes); } public class SomeOtherThatExecuteServices { public SomeOtherThatExecuteServices(IServiceFactory serviceFactory) { ServiceFactory = serviceFactory; } public IEnumerable ExecuteServices() { return ServiceFactory.GetServices() .Select(service => service.Execute()); } public IServiceFactory ServiceFactory { get; set; } } 

可能你会想通过一些映射键访问工厂,可能你会想要在SomeOtherThatExecuteServices正确的逻辑,但所有这些都会让你以正确的方式(+使用一些合适的IoC容器)