IDbContextFactory-为数据库创建上下文。
好的,我们可能在业务层中,在该层中,类与数据访问层进行交互。看起来不错
IMapper-从实体到领域模型的映射。
没有整体情况就很难说什么。可能是架构错误,并且映射应该直接由数据访问层完成,或者可能是架构非常好。在所有情况下,这里都具有这种依赖性是有意义的。
另一种选择是将类分为两类:一种是处理映射,另一种是处理实际的业务逻辑。这将创建一个事实上的层,它将BL与DAL进一步分开。如果映射很复杂,那可能是个好主意。但是,在大多数情况下,这只会增加无用的复杂性。
IClock-摘要DateTime.Now以帮助进行单元测试。
拥有单独的接口(和类)来获取当前时间可能不是很有用。我只是将传递DateTime.Now
给需要当前时间的方法。
如果还有其他信息(例如时区或日期范围等),则单独的类可能有意义。
IPerformanceFactory-测量特定方法的执行时间。
参见下一点。
ILog-用于记录的Log4net。
这种超越功能应该属于该框架,并且实际的库应在运行时可互换和可配置(例如,通过.NET中的app.config)。
不幸的是,情况还不是这样,您可以选择一个库并坚持使用它,或者创建一个抽象层,以便以后需要时可以交换库。如果您的意图是独立于库的选择,那就去吧。如果您确定可以继续使用库多年,请不要添加抽象。
如果该库太复杂而无法使用,则可以使用外观模式。
ICollectionWrapperFactory-创建集合(扩展IEnumerable)。
我认为这会创建域逻辑所使用的非常具体的数据结构。它看起来像一个实用程序类。而是,对每个数据结构使用一个带有相关构造函数的类。如果初始化逻辑在适合构造函数的过程中有点复杂,请使用静态工厂方法。如果逻辑更加复杂,请使用工厂或构建器模式。
IQueryFilterFactory-基于将查询数据库的输入生成查询。
为什么不在数据访问层中呢?为什么Filter
名字有一个?
IIdentityHelper-检索登录的用户。
我不确定为什么会有Helper
后缀。在所有情况下,其他后缀也不会特别明确(IIdentityManager
?)
无论如何,在这里具有这种依赖性是很有意义的。
IFaultFactory-创建不同的FaultException(我使用WCF)。
逻辑如此复杂以至于需要使用工厂模式?为什么要使用依赖注入?您是否会在生产代码和测试之间交换异常的创建?为什么?
我会尝试将其重构为简单的throw new FaultException(...)
。如果在将某些全局信息传播到客户端之前应将其添加到所有异常中,则WCF可能具有一种机制,您可以捕获未处理的异常并将其更改并重新抛出给客户端。