我已经使用了相当多的依赖注入,但我想获得有关如何在运行时处理来自用户的信息的输入. 我有一个连接到com端口的类.我允许用户选择com端口号.现在,我将该com port参数作为构造函数参
我有一个连接到com端口的类.我允许用户选择com端口号.现在,我将该com port参数作为构造函数参数.原因是如果没有那些信息,类就无法运行,而且它的实现是特定的(这个类的模拟版本不需要com端口).
另一种方法是使用“开始”方法接收com端口,或者具有设置com端口的属性.这使得它与IoC容器非常兼容,但从类的角度来看它并不一定有意义.
似乎逻辑路由与依赖注入设计冲突,但这是因为我的UI正在获取特定类型的类的信息.
其他替代方法包括使用IoC容器,它允许我传入额外的构造函数参数,或者只是在顶层构建我需要的类而不使用依赖注入.
对于这类问题,是否存在普遍接受的标准模式?
根据您的需要,您可以选择两条路线.1.将UI直接连接到您的具体类
这是最简单的选择,但很多时候完全可以接受.虽然您可能拥有包含大量接口和使用DI的域模型,但UI构成了对象图的组合根,您可以在此处简单地连接您的具体类,包括您需要的端口号参数.
好处是这种方法简单易懂,易于理解和实施.
缺点是你的灵活性会降低.您将无法随意替换另一个实现(但是,您可能不需要这种灵活性).
即使将UI锁定为具体实现,这并不意味着域模型本身在其他应用程序中不可重用.
2.添加抽象工厂
另一种选择是添加另一层间接.它可以使用抽象工厂来创建实例,而不是让UI直接创建类.
工厂的Create方法可以将端口号作为输入,因此该抽象属于UI子层中的最佳.
public abstract class MyFactory { public abstract IMyInterface Create(int portNumber); }
然后,您可以将您的DI容器连接到此工厂的实现,该工厂使用端口号并将其作为构造函数参数传递给您的实际实现.其他工厂实现可能只是忽略该参数.
这种方法的优点是您不会污染您的API(或您的具体实现),并且您仍然可以灵活地为接口编程.
缺点是它增加了另一层间接.