我在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;}
如何解决我的应用程序中的所有表单?
答案 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>
因此,解决方案是保持唯一容器,即您进行所有注册的容器。并使用那个来完成所有解析,优先不是通过传递容器或引用静态服务定位器,而是只解析一个根对象并注入完成所有解析所需的工厂。