0

我在我的 WinForms 应用程序中使用统一容器并注册接口和类。但是当打开其他表单时,它不适用于获取数据。它只适用于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 检索数据,但是当切换到添加/更新表单时,它返回错误:{“对象引用未设置为对象的实例。”}

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

4

1 回答 1

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

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

于 2018-03-21T07:32:24.377 回答