在WPF应用程序中放置和配置IoC容器的位置?

mat*_*i82 15 wpf containers inversion-of-control unity-container where

我正在研究中型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
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就能通过static属性从应用程序的任何地方访问容器:

App.MyUnityContainer
Run Code Online (Sandbox Code Playgroud)

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

Fil*_*ini 8

看看组合根模式.你想要做的是在你的Startup事件处理程序中初始化它,并忘记它存在于应用程序的其余部分.

您正在尝试实施服务定位器模式,根据许多模式,这是一个较差的解决方案.

  • @JoaoMilasch确切地说,这就是主意!如果您想深入挖掘一下[本书](http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501),我会继续推荐它,因为它回答了很多关于DI的问题. (2认同)

joh*_*son 6

让我发布我已经得出的结论,并希望它能帮助人们.纠正是否有任何错误!: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,没有全局变量或单例,只要MainWindow执行,容器就会存活,并且只要容器知道它们,就会自动解析此组合图后面的所有依赖项.