4

我在 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>());
}

我的问题是当我的 MainForm 尝试创建子表单时:

    ChildForm childForm = new ChildForm();
    childForm.Show();

我收到一个错误,因为我正在尝试使用构造函数注入并且我没有传入构造函数参数。我还尝试使用带有 [Dependency] 属性的 setter 注入,但这也不起作用。我应该如何做到这一点?我可以让我的主窗体具有所有依赖项并将所需的对象传递给子窗体,但如果我最终有许多子窗体,那么主窗体会很乱。

4

2 回答 2

3

为了让 Unity 注入构造函数参数,您需要使用容器来解析子表单。因此,您需要在某处保存对容器的引用,然后调用:

ChildForm childForm = container.Resolve<ChildForm>();

这将允许 Unity 评估 ChildForm 构造函数并注入适当的依赖项。

于 2013-01-31T20:48:56.333 回答
3

在上面的评论中,您提到了“使 [ing] 容器成为 program.cs 的公共属性”。

不要那样做。

如果您的表单依赖于容器,请将其视为任何其他依赖项。

  • 将容器添加到容器中。
  • 使用属性或 ctor 注入来让表单访问容器。

    static void Main()
    {
    
        IUnityContainer container = new UnityContainer();
    
        container
            .RegisterType<MainForm>()
            .RegisterInstance<IUnityContainer>(container);
    

.

    public partial class MainForm: Form
    {
        [Dependency]
        public IUnityContainer Container { get; set; }
于 2014-11-11T20:30:25.393 回答