【发布时间】:2010-12-28 22:50:45
【问题描述】:
我正在尝试让 Unity 管理我的对象的创建,并且我想要一些在运行时才知道的初始化参数:
目前我能想到的唯一方法是在接口上有一个 Init 方法。
interface IMyIntf {
void Initialize(string runTimeParam);
string RunTimeParam { get; }
}
然后使用它(在 Unity 中)我会这样做:
var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");
在这种情况下,runTimeParam 参数是在运行时根据用户输入确定的。这里的简单情况只是返回 runTimeParam 的值,但实际上参数将类似于文件名,并且初始化方法将对文件执行某些操作。
这会产生一些问题,即Initialize 方法在接口上可用并且可以多次调用。在实现中设置标志并在重复调用 Initialize 时抛出异常似乎很笨拙。
在我解决我的界面时,我不想知道任何关于IMyIntf 的实现的信息。不过,我真正想要的是知道这个接口需要某些一次性初始化参数。有没有办法用这些信息以某种方式注释(属性?)接口,并在创建对象时将这些信息传递给框架?
编辑:多描述一下界面。
【问题讨论】:
-
您错过了使用 DI 容器的意义。应该为您解决依赖关系。
-
您从哪里获得所需的参数? (配置文件,数据库,??)
-
runTimeParam是在运行时根据用户输入确定的依赖项。是否应该将其拆分为两个接口——一个用于初始化,另一个用于存储值? -
IoC 中的依赖,通常是指对其他 ref 类型的类或对象的依赖,可以在 IoC 初始化阶段确定。如果你的类只需要一些值来工作,那么你的类中的 Initialize() 方法就派上用场了。
-
我的意思是假设您的应用中有 100 个类可以应用这种方法;那么你必须为你的类创建额外的 100 个工厂类 + 100 个接口,如果你只是使用 Initialize() 方法,你可以侥幸逃脱。
标签: dependency-injection inversion-of-control unity-container ioc-container interface-design