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