让我们想象下面的轮廓(我假设我们使用的是ASP.NET MVC,但对于这个问题并不重要)
我们有直接从控制器使用的存储库
某些存储库方法需要以某种特定的方式处理,组合,缓存等。因此,我们为这些情况创建服务。所以现在应该从服务访问一些存储库方法,但不能直接访问。从正确的地方使用控制存储库方法的方法是什么?
我看到以下方式:
根本不要直接使用存储库 - 仅从服务中使用它们(我们甚至可以使存储库在内部并且仅对服务程序集可见)。但在这种情况下,我们必须创建repostories方法的包装器,即使是可以直接从存储库中使用的方法。
但我非常确定有更多有趣,美观和灵活的方法来实现它......
答案 0 :(得分:3)
我见过的一般最佳实践建议是,如果有时需要,请始终使用服务层。这样你就习惯了它并使用它,并且当你应该使用它时不会错误地绕过它。
然而,在我的应用程序中,这不是我在非常类似的情况下所做的。在我们的应用程序中,我们有DAL(数据访问层)类和BAL *业务访问层)类。但是,绝大多数呼叫不需要任何业务规则。在25个DAL中,我们只需要3个BAL。所以22个BAL的其余部分只是直面/代理类。
因此,为了解决这个问题,我们定义了一个所有DAL / BAL类都实现的接口(每种类型一个)。因此,对于UserDal和UserBal,两者都实现了IUser(或者UserBal可能完全丢失,实际上就是用户的情况)。
然后我们使用反射来实现以下方法:
BalFactory.GetClass<IUser>()
将在BAL命名空间中查找IUser的实现,如果找不到,则从DAL命名空间返回IUser实现。然后,如果我们以后需要添加一个BAL类,当我们原来没有它时,我们只需要使用适当的接口将它添加到BAL命名空间,它就会被自动拾取和使用。
大约四年前,我们开始在应用程序中使用它进行反思,我们对它非常满意。今天,我认为你可以用MEF更轻松地做到这一点。