架构问题:使用依赖注入导致垃圾API

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需要整数和用户.他们需要知道类的实现才能使用它.

我知道我必须在这里遇到某种设计问题.谁能给我一些指示?

Ser*_*eit 2

正如 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)

从而创建了另一个没有可注入依赖项的地方。现在,您无需将用户传递给可能需要它的每个方法。