复合设计模式:如何将结果从一个组件传递到另一个组件?
我有以下代码:
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容器)