大家好。我遇到了使用存储库和服务模型的奇怪设计模式。该应用程序由 ASP.NET MVC、WCF 和一些 Windows 服务组成。我的存储库正在使用 LINQ DataContext。随着我的应用程序的发展,我发现自己到处都在传递对 IWhateverService 服务的引用。例如,我有 IAccountService,它定义了诸如 ChangePlan(Account account, Plan plan) 之类的方法。
现在,似乎 IAccountService 是放置此方法的最佳位置,因为我们在这里为帐户提供服务。但是,ChangePlan 方法需要知道几件事才能真正更改计划。它必须知道用户的当前使用情况、可用计划列表、用于计费的电子商务服务接口的实例等。
我认为让 ChangePlan 方法接受 IAccountService 接口中的所有必需服务。但是这些其他服务的要求是一个实现问题,不应该是接口定义的一部分。
因此,现在我发现自己为 AccountService 创建了一个巨大的构造函数,其中包含 IAccountRepository、IPPlanService、IUsageService、IEcommerceService 和 IValidationDictionary 的实例。这感觉根本不对。
现在以这种情况为例。显然 IAccountService 包含一个通过 ID 检索用户帐户的简单方法: Account Get(int id) 有几次我只需要调用这个方法。所以,我去创建我的 AccountService,它需要所有这些其他服务的实例(尤其是 IValidationDictionary,我不需要对此进行验证)。再一次,这感觉不对。我可以传递 null,但这只是因为我知道实现不会仅将它们用于此方法。
此外,为了避免在需要的任何地方实例化服务,我创建了一个名为 ServiceFactory 的静态类,它具有静态方法、CreateAccountService、CreatePlanService 等……我在应用程序周围调用这些方法。看起来不错,但我无法摆脱这种不合适的感觉。
我的断线在哪里?有人有什么建议吗?
谢谢。
安德鲁