现在,似乎IAccountService是放置此方法的最佳位置,因为我们在此处为帐户提供服务.但是,ChangePlan方法在实际更改计划之前需要了解一些事情.它必须知道用户的当前使用情况,可用计划列表,用于计费的电子商务服务界面的实例等.
我认为让ChangePlan方法接受IAccountService接口中的所有必需服务.但是这些其他服务的要求是实现的问题,不应该是接口定义的一部分.
所以现在我发现自己为AccountService创建了一个巨大的构造函数,它采用了IAccountRepository,IPlanService,IUsageService,IEcommerceService和IValidationDictionary的实例.这根本感觉不对.
现在采取这种情况.显然,IAccountService包含一个通过ID检索用户帐户的简单方法:Account Get(int id)有几次我只需要调用此方法.所以,我去创建我的AccountService,它想要所有这些其他服务的实例(特别是IValidationDictionary,我不需要验证).再次,这感觉不对.我可以传递null,但这只是因为我知道实现不会将它们用于此方法.
另外,为了避免在我需要的地方实例化服务,我创建了一个名为ServiceFactory的静态类,它有静态方法,CreateAccountService,CreatePlanService等……我在应用程序周围调用这些方法.似乎还可以,但我不能动摇这种不合适的感觉.
我的断开在哪里?有人有什么建议吗?
谢谢.
安德鲁
您描述的设计似乎与 SOLID原则非常一致.许多较小的组件通常也被认为是良好的设计.SOLID原则通常会接受您在实现中描述的非规范化,而宁愿专注于让这样一个组件的每个外部用例都有自己的接口.
我认为你遇到的主要问题是你花了太多时间想知道如何构造这些对象.你可能应该看一个依赖注入框架来处理这个问题,比如Castle Windsor.那么你只需要构建完整状态的对象,而不用担心每次调用都没有使用所有依赖项.