我正在尝试让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
实现的事情。不过,我想要的是知道这个接口需要特定的一次性初始化参数。有没有办法以某种方式注释(属性?)并在创建对象时将这些信息传递给框架?
编辑:对界面进行了更多的描述。
发布于 2009-12-22 08:56:36
我不能用特定的Unity术语来回答,但听起来您只是在学习依赖注入。如果是这样的话,我强烈建议您阅读简短、清晰和信息丰富的user guide for Ninject。
本文将带您了解使用DI时的各种选择,以及如何解决您在使用DI的过程中将面临的特定问题。在您的例子中,您很可能希望使用DI容器来实例化您的对象,并让该对象通过构造函数获得对其每个依赖项的引用。
本演练还详细说明了如何使用特性在运行时对方法、属性甚至参数进行批注以区分它们。
即使你不使用Ninject,演练中也会给出适合你的功能的概念和术语,你应该能够将这些知识映射到Unity或其他DI框架中(或者说服你尝试一下Ninject )。
发布于 2009-12-22 10:08:32
我想我已经解决了这个问题,而且感觉相当不错,所以肯定有一半是对的:)
我把IMyIntf
分成了"getter“和"setter”两个接口。所以:
interface IMyIntf {
string RunTimeParam { get; }
}
interface IMyIntfSetter {
void Initialize(string runTimeParam);
IMyIntf MyIntf {get; }
}
然后实现:
class MyIntfImpl : IMyIntf, IMyIntfSetter {
string _runTimeParam;
void Initialize(string runTimeParam) {
_runTimeParam = runTimeParam;
}
string RunTimeParam { get; }
IMyIntf MyIntf {get {return this;} }
}
//Unity configuration:
//Only the setter is mapped to the implementation.
container.RegisterType<IMyIntfSetter, MyIntfImpl>();
//To retrieve an instance of IMyIntf:
//1. create the setter
IMyIntfSetter setter = container.Resolve<IMyIntfSetter>();
//2. Init it
setter.Initialize("someparam");
//3. Use the IMyIntf accessor
IMyIntf intf = setter.MyIntf;
IMyIntfSetter.Initialize()
仍然可以被多次调用,但是使用一些Service Locator paradigm,我们可以很好地包装它,这样IMyIntfSetter
几乎就是一个内部接口,有别于IMyIntf
。
https://stackoverflow.com/questions/1943576
复制相似问题