是否可以在具有不同业务的域服务中使用通用服务?

时间:2019-05-26 19:10:52

标签: c# design-patterns domain-driven-design domainservices

我在创建通用域服务时是否遇到问题?? 我拥有从其继承任何实体的“ BaseEntity”,并且是在实现每个实体业务的存储库.my域服务层中调用的更新或插入方法时的每时每刻都设置为值。我的问题是当我在域服务的每个服务中都有一个实现的业务时我该怎么办。我可以使用通用类和接口来管理BaseEntity然后更改业务,例如Update方法覆盖base update方法还是我用于每个实体一种服务类,具有一个接口和独立的业务?

1 个答案:

答案 0 :(得分:0)

在大多数情况下,我建议您不要针对您的域使用任何通用基类。如果您具有类的层次结构,则可能是您拥有一个更具技术性/框架性的领域,但即使在那儿,您也应该偏爱composition over inheritance

例如,我不会使用BaseEntity,因为我发现它是多余的。您可能会遇到的结局可能是带有IRepository<T>T Get(Guid id)方法的void Save(T instance)之类的东西,但是您必须确切地考虑在哪里使用这样的东西。您可以遵循single responsibility principle并使用IRepositoryGetIRepositorySave来明确角色。但是,这些类型的接口仅在对象之间具有广泛的共性且通常不会发生的情况下才有用。您也许发现一些 lookup 数据似乎适合该空间,但是即使在那儿,您也可能希望设计一个公共存储库,而不是为每种类型设计单独的存储库。

您绝对要避免的是拥有一个粗粒度的接口,然后抛出各种NotImplementedException。当您发现自己正在这样做时,宁可将接口拆分为更细粒度的版本,并仅实现所需的接口。这样,您可以使用安全的强制转换来确保在调用该方法之前实现了该接口。