如何使用统一容器

时间:2018-03-16 23:22:50

标签: c# winforms unity-container dependency-resolver

我在WinForms应用程序中使用unity容器并注册接口和类。但是当打开其他形式时,它不能用于获取数据。它只是为form1工作。 如何解决所有表格?

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        RegisterType(new UnityContainer());
    }

    public static void RegisterType(IUnityContainer container)
    {
        container.RegisterType<IBlogRepository, BlogRepository>();
        container.RegisterType<IPostRepository, PostRepository>();

        Application.Run(container.Resolve<Form1>());
    }
}

这是form1()中的构造函数注入:

public partial class Form1: Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private readonly IBlogRepository _blogRepository;

    public Form1(IBlogRepository blogRepository) : this()
    {
        _blogRepository = blogRepository;
    }

}

这是formAddUpdate()中的构造函数注入:

public partial class FormAddUpdate : Form
{
    public FormAddUpdate()
    {
        InitializeComponent();
    }

    private readonly IBlogRepository _blogRepository;
    private readonly IPostRepository _postRepository;

    public FormAddUpdate(IBlogRepository blogRepository, IPostRepository postRepository) : this()
    {
        _blogRepository = blogRepository;
        _postRepository = postRepository;
    }

}

现在当运行应用程序我可以从from1检索数据但是切换到添加/更新表单时,它会返回错误:{&#34;对象引用未设置为对象的实例。&#34;}

如何解决我的应用程序中的所有表单?

1 个答案:

答案 0 :(得分:1)

如果您查看代码,则只能从容器中解析一种类型(Form1)。在那之后,可怜的容器就死了。

    RegisterType(new UnityContainer());
}

public static void RegisterType(IUnityContainer container)
{
    container.RegisterType<IBlogRepository, BlogRepository>();
    container.RegisterType<IPostRepository, PostRepository>();

    Application.Run(container.Resolve<Form1>());
}

当您在其他地方创建另一个要解决的容器时,比如Form2,它对第一个容器所做的注册一无所知,因此它既不能解析BlogRepository也不能解析PostRepository。< / p>

因此,解决方案是保持唯一容器,即您进行所有注册的容器。并使用那个来完成所有解析,优先不是通过传递容器或引用静态服务定位器,而是只解析一个根对象并注入完成所有解析所需的工厂。