首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否有初始化通过DI容器创建的对象的模式

是否有初始化通过DI容器创建的对象的模式
EN

Stack Overflow用户
提问于 2009-12-22 08:47:01
回答 2查看 74.2K关注 0票数 151

我正在尝试让Unity来管理我的对象的创建,我希望有一些直到运行时才知道的初始化参数:

目前,我能想到的唯一方法就是在接口上使用Init方法。

代码语言:javascript
复制
interface IMyIntf {
  void Initialize(string runTimeParam);
  string RunTimeParam { get; }
}

然后,为了使用它(在Unity中),我会这样做:

代码语言:javascript
复制
var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");

在此场景中,runTimeParam参数在运行时根据用户输入确定。这里的简单用例只是返回runTimeParam的值,但实际上参数是文件名,初始化方法将对文件执行某些操作。

这会产生许多问题,即Initialize方法在接口上可用,并且可以多次调用。在实现中设置一个标志并在重复调用Initialize时抛出异常看起来很笨拙。

在解析我的接口时,我不想知道任何关于IMyIntf实现的事情。不过,我想要的是知道这个接口需要特定的一次性初始化参数。有没有办法以某种方式注释(属性?)并在创建对象时将这些信息传递给框架?

编辑:对界面进行了更多的描述。

EN

回答 2

Stack Overflow用户

发布于 2009-12-22 08:56:36

我不能用特定的Unity术语来回答,但听起来您只是在学习依赖注入。如果是这样的话,我强烈建议您阅读简短、清晰和信息丰富的user guide for Ninject

本文将带您了解使用DI时的各种选择,以及如何解决您在使用DI的过程中将面临的特定问题。在您的例子中,您很可能希望使用DI容器来实例化您的对象,并让该对象通过构造函数获得对其每个依赖项的引用。

本演练还详细说明了如何使用特性在运行时对方法、属性甚至参数进行批注以区分它们。

即使你不使用Ninject,演练中也会给出适合你的功能的概念和术语,你应该能够将这些知识映射到Unity或其他DI框架中(或者说服你尝试一下Ninject )。

票数 1
EN

Stack Overflow用户

发布于 2009-12-22 10:08:32

我想我已经解决了这个问题,而且感觉相当不错,所以肯定有一半是对的:)

我把IMyIntf分成了"getter“和"setter”两个接口。所以:

代码语言:javascript
复制
interface IMyIntf {
  string RunTimeParam { get; }
}


interface IMyIntfSetter {
  void Initialize(string runTimeParam);
  IMyIntf MyIntf {get; }
}

然后实现:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1943576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档