Dav*_*vid 5 c# architecture api dependency-injection castle-windsor
我想创建一个类来执行各种与数据库相关的低级操作,但是它提供了一个非常简单的UI层接口.
此类表示特定聚合根中的一组数据,由单个ID int检索.
构造函数有四个参数:
public AssetRegister(int caseNumber, ILawbaseAssetRepository lawbaseAssetRepository, IAssetChecklistKctcPartRepository assetChecklistKctcPartRepository, User user)
{
_caseNumber = caseNumber;
_lawbaseAssetRepository = lawbaseAssetRepository;
_assetChecklistKctcPartRepository = assetChecklistKctcPartRepository;
_user = user;
LoadChecklists();
}
Run Code Online (Sandbox Code Playgroud)
UI层通过接口访问此类IAssetRegister.Castle Windsor本身可以提供ILawbaseAssetRepository和IAssetChecklistKctcPartRepository参数,但UI代码需要使用匿名类型提供其他两个:
int caseNumber = 1000;
User user = GetUserFromPage();
IAssetRegister assetRegister = Moose.Application.WindsorContainer.Resolve<IAssetRegister>(new { caseNumber, user});
Run Code Online (Sandbox Code Playgroud)
从API设计的角度来看,这是垃圾.UI层开发人员无法知道IAssetRegister需要整数和用户.他们需要知道类的实现才能使用它.
我知道我必须在这里遇到某种设计问题.谁能给我一些指示?
正如 Morten 指出的那样,将不可注入的依赖项从构造函数调用移至实际需要使用它的方法,
如果您的构造函数参数无法(或很难)注入,您将无法自动注入IAssetRegister任何需要它的类。
当然,您始终可以IUserProvider按照以下方式创建一个具有具体实现的接口:
public class UserProvider : IUserProvider
{
// interface method
public User GetUser()
{
// you obviously don't want a page dependency here but ok...
return GetUserFromPage();
}
}
Run Code Online (Sandbox Code Playgroud)
从而创建了另一个没有可注入依赖项的地方。现在,您无需将用户传递给可能需要它的每个方法。