Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带子窗体的Windows窗体中的Unity DI_C#_Winforms_Unity Container - Fatal编程技术网

C# 带子窗体的Windows窗体中的Unity DI

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

我正在windows窗体应用程序中使用Unity DI。到目前为止,它正在将依赖项解析为program.cs中的主窗体,如下所示:

    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; }