【发布时间】:2011-03-11 11:04:02
【问题描述】:
我正在尝试创建一个类,该类执行各种与数据库相关的低级操作,但为 UI 层提供了一个非常简单的接口。
这个类代表了一堆数据,它们都在一个特定的聚合根中,由单个 ID int 检索。
构造函数有四个参数:
public AssetRegister(int caseNumber, ILawbaseAssetRepository lawbaseAssetRepository, IAssetChecklistKctcPartRepository assetChecklistKctcPartRepository, User user)
{
_caseNumber = caseNumber;
_lawbaseAssetRepository = lawbaseAssetRepository;
_assetChecklistKctcPartRepository = assetChecklistKctcPartRepository;
_user = user;
LoadChecklists();
}
UI层通过接口IAssetRegister访问这个类。 Castle Windsor 可以自己提供 ILawbaseAssetRepository 和 IAssetChecklistKctcPartRepository 参数,但 UI 代码需要使用匿名类型提供另外两个,如下所示:
int caseNumber = 1000;
User user = GetUserFromPage();
IAssetRegister assetRegister = Moose.Application.WindsorContainer.Resolve<IAssetRegister>(new { caseNumber, user});
从 API 设计的角度来看,这是垃圾。 UI 层开发人员无法知道 IAssetRegister 需要一个整数和一个用户。他们需要知道类的实现才能使用它。
我知道我这里一定有某种设计问题。谁能指点一下?
【问题讨论】:
-
仅对可注入的依赖项使用构造函数注入。将手动赋值的值移动为方法参数或在构造后提供设置方法。
-
哈哈@thephpdeveloper 的编辑!
-
是的,那个编辑也让我发笑。不知道你是否真的应该以这种方式“与作者的风格个性混为一谈”:)
-
导致垃圾 API 的不是 DI。你用的是SL,这是常见的气味。不要做SL。
-
我从来没有说 DI 本身会导致垃圾 API,只是我(误)使用它。
标签: c# api architecture dependency-injection castle-windsor