【问题标题】:Avoiding container.Resolve in simple factory?避免容器。在简单工厂中解决?
【发布时间】:2016-03-07 12:25:55
【问题描述】:

Unity 和 DI 新手。我正在将容器传递到我的视图模型中并调用 .Resolve 当我想要一个我现在知道是不好的做法的新视图实例时。

我现在通过一个简单的工厂类解析视图,该工厂类作为接口传递到视图模型构造函数中:

this.dialogView = this.dialogViewFactory.CreateDialogView();

我在 Unity 中调用 RegisterType 来解析视图和视图模型:

this.unityContainer.RegisterType(typeof(IDialogView), typeof(DialogView));
this.unityContainer.RegisterType(typeof(IDialogViewModel), typeof(DialogViewModel));
this.unityContainer.RegisterType(typeof (IDialogViewFactory), typeof (DialogViewFactory));

最后,我的工厂课。我目前正在传递容器并在此处调用 resolve。我知道虽然我已将依赖项移出视图模型,但我仍然在工厂类中拥有容器依赖项:

public class DialogFactory : IDialogFactory
{
    private IUnityContainer unityContainer;

    public DialogFactory(IUnityContainer unityContainer)
    {
        this.unityContainer = unityContainer;
    }

    public IDialogView CreateDialogView()
    {
        return this.unityContainer.Resolve<IDialogView>();
    }
}

什么是最好的解决方案?

【问题讨论】:

标签: c# dependency-injection unity-container


【解决方案1】:

您可以使用 Unity 的 Automatic Factories 通过注入 Func&lt;IDialogView&gt; 来消除对工厂的需要:

public class ViewModel
{
    private Func<IDialogView> dialogViewFactory;

    public ViewModel(Func<IDialogView> dialogViewFactory)
    {
        this.dialogViewFactory = dialogViewFactory;
    }

    private IDialogView CreateDialogView()
    {
        return this.dialogViewFactory();
    }
}

如果你想要/需要一个正式的工厂,你也可以使用这种方法注入 DialogFactory 本身:

public class DialogFactory : IDialogFactory
{
    private Func<IDialogView> dialogViewFactory;

    public DialogFactory(Func<IDialogView> dialogViewFactory)
    {
        this.dialogViewFactory = dialogViewFactory;
    }

    public IDialogView CreateDialogView()
    {
        return this.dialogViewFactory();
    }
}

【讨论】:

    猜你喜欢
    • 2019-04-24
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多