17

我正在开发一个中型 WPF 应用程序 (MVVM),该应用程序将来应该是可扩展和可维护的。因此,我决定使用 IoC 容器(在本例中为 Unity)来保持灵活性。

但是我不确定在 WPF 应用程序中放置和配置 Unity 的位置。

我猜容器应该可以全局访问,所以它可能应该去 Application 类。但是我应该把它作为静态属性吗?我应该在 Application_Startup() 事件处理程序中配置它吗?

例如:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    public static UnityContainer MyUnityContainer;


    private void Application_Startup(object sender, StartupEventArgs e)
    {
        // instantiate and configure Unity
    }
}

这样我就可以通过静态属性从应用程序中的任何位置访问容器:

App.MyUnityContainer

我想这是一种方法,但我不确定是否有更好的做法来解决这个问题,特别是针对 WPF 应用程序。

4

3 回答 3

8

看看Composition Root Pattern。您要做的是在您的 Startup 事件处理程序中对其进行初始化,并在应用程序的其余部分忘记它的存在。

您正在尝试实施Service Locator Pattern,根据许多人的说法,这对于这个问题来说是一个较差的解决方案

于 2012-04-30T06:58:23.463 回答
7

让我发布我的结论,希望它能帮助人们。如有不对请指正!:P

我想我们会研究这样的事情:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        UnityContainer myUnityContainer = new UnityContainer();
        //make sure your container is configured
        myUnityContainer.RegisterType<ISomeDependency, SomeDependencyImplementation>();
        myUnityContainer.RegisterType<IMainWindow, MainWindow>();

        myUnityContainer.Resolve<IMainWindow>().Show();
    }
}

public partial class MainWindow : Window, IMainWindow
{
    private ISomeDependency _someDependency;

    public MainWindow(ISomeDependency someDependency)
    {
        _someDependency = someDependency;
    }
}

请注意,没有全局变量或单例,只要 MainWindow 存在,容器就会继续存在,并且只要容器知道它们,该入口点后面的所有依赖项就会自动解决。

于 2012-10-16T12:17:44.730 回答
1

根据 Unity 容器的新版本,我们还必须注册它自己的实例,以便通过构造函数注入在视图模型中获取它。

App.xaml.cs 文件:

protected override void OnStartup(StartupEventArgs e)
{
       var unityIoC = new UnityContainer();
       unityIoC.RegisterTypes(AllClasses.FromAssembliesInBasePath(), WithMappings.FromMatchingInterface, WithName.Default);
       unityIoC.RegisterInstance(typeof(IUnityContainer), unityIoC);
}

查看模型类

[InjectionConstructor]
public MyViewModel(IUnityContainer container)
{
}

现在统一容器将在视图模型中可供我们使用,并可用于解析。

于 2017-10-28T04:28:46.863 回答