加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

依赖注入 – 是否有一种模式用于初始化通过DI容器创建的对象

发布时间:2020-12-14 01:37:02 所属栏目:百科 来源:网络整理
导读:我试图让Unity来管理我的对象的创建,我想有一些初始化参数,直到运行时才知道: 目前,我唯一能想到的方法是在接口上有一个Init方法。 interface IMyIntf { void Initialize(string runTimeParam); string RunTimeParam { get; }} 然后使用它(在Unity中)我
我试图让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的实现。但我想要的是知道这个接口需要一定的一次性初始化参数。有没有办法以某种方式用这个信息注释(属性?)接口,并将这些传递到框架当对象被创建?

编辑:描述接口多一点。

任何需要运行时值来构造特定依赖关系的地方,Abstract Factory是解决方案。

对接口的初始化方法漏洞抽象的气味。

在你的情况下,我会说,你应该建模IMyIntf接口,如何你需要使用它 – 不是你打算如何创建它的实现。这是一个实现细节。

因此,接口应该简单地是:

public interface IMyIntf
{
    string RunTimeParam { get; }
}

现在定义抽象工厂:

public interface IMyIntfFactory
{
    IMyIntf Create(string runTimeParam);
}

现在可以创建一个具体的IMyIntfFactory实现,创建IMyIntf的具体实例,如下所示:

public class MyIntf : IMyIntf
{
    private readonly string runTimeParam;

    public MyIntf(string runTimeParam)
    {
        if(runTimeParam == null)
        {
            throw new ArgumentNullException("runTimeParam");
        }

        this.runTimeParam = runTimeParam;
    }

    public string RunTimeParam
    {
        get { return this.runTimeParam; }
    }
}

注意这是如何允许我们通过使用readonly关键字来保护类的不变量。无臭有必要初始化方法。

一个IMyIntfFactory实现可能是这样简单:

public class MyIntfFactory : IMyIntfFactory
{
    public IMyIntf Create(string runTimeParam)
    {
        return new MyIntf(runTimeParam);
    }
}

在所有的消费者,你需要一个IMyIntf实例,你只需要依赖于IMyIntfFactory通过请求它通过构造函数注入。

如果你注册它的任何DI容器盐它将能够为你自动连接一个IMyIntfFactory实例。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读