C# 带子窗体的Windows窗体中的Unity DI
我正在windows窗体应用程序中使用Unity DI。到目前为止,它正在将依赖项解析为program.cs中的主窗体,如下所示:C# 带子窗体的Windows窗体中的Unity DI,c#,winforms,unity-container,C#,Winforms,Unity Container,我正在windows窗体应用程序中使用Unity DI。到目前为止,它正在将依赖项解析为program.cs中的主窗体,如下所示: static void Main() { IUnityContainer container = new UnityContainer(); container.AddNewExtensionIfNotPresent<EnterpriseLibraryCoreExtension>(); container.Register
static void Main()
{
IUnityContainer container = new UnityContainer();
container.AddNewExtensionIfNotPresent<EnterpriseLibraryCoreExtension>();
container.RegisterType<IAccountService, AccountService>();
container.RegisterType<IAccountRepository, AccountRepository>();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(container.Resolve <MainForm>());
}
我得到一个错误,因为我试图使用构造函数注入,但我没有传递构造函数参数。我还尝试使用带有[Dependency]属性的setter注入,但也不起作用。我应该如何做到这一点?我可以让我的主窗体具有所有依赖项,并将所需的对象传递给子窗体,但是如果我最终拥有许多子窗体,那么主窗体将是混乱的。为了让Unity注入构造函数参数,您需要使用容器来解析子窗体。因此,您需要在某个位置保留对容器的引用,然后调用:
ChildForm childForm = container.Resolve<ChildForm>();
ChildForm ChildForm=container.Resolve();
这将允许Unity评估子窗体构造函数并注入适当的依赖项。在上面的评论中,您提到“使容器成为program.cs的公共属性” 不要那样做 如果表单对容器有依赖关系,请将其视为任何其他依赖关系
- 将容器添加到容器中
- 使用属性或ctor注入为表单提供对容器的访问权限
static void Main() { IUnityContainer container = new UnityContainer(); container .RegisterType<MainForm>() .RegisterInstance<IUnityContainer>(container);
谢谢,我没有意识到我可以将容器作为program.cs的公共属性并在表单中引用它。你的回答让我明白了。这闻起来很像服务定位器static void Main() { IUnityContainer container = new UnityContainer(); container .RegisterType<MainForm>() .RegisterInstance<IUnityContainer>(container);
public partial class MainForm: Form { [Dependency] public IUnityContainer Container { get; set; }