如何使用 Unity 容器解析所有表单



我在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 检索数据时,但是当切换到添加/更新表单时,它会返回错误:{"对象引用未设置为对象的实例。

如何解决我申请中的所有表单?

如果你看一下你的代码,你只解析一个类型(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

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

相关内容

  • 没有找到相关文章

最新更新