在WPF应用程序中使用unity来应用DI

时间:2013-01-04 15:13:28

标签: wpf unity-container

阅读Unity框架的文档后我感到困惑。 link

我正在编写一个WPF应用程序,它将搜索一些设备 在我的主窗口的代码下面。 如您所见,现在我仍在我的主窗口中声明UnitOfWork和DeviceService。我想通过应用依赖注入替换此代码。同时我也会在我的主窗口中注入我的viewmodel。

 public Window1()
    {
        InitializeComponent();

        UnitOfWork myUnitOfWork = new UnitOfWork();
        DeviceService dService = new DeviceService(myUnitOfWork);

        _vm = new DeviceViewModel(dService);
        this.DataContext = _vm;

        _vm.SearchAll();            
    }

我在下面的代码中尝试了但是我在设置容器时失败了。真正的问题是我该如何开始?我是否需要完全改变程序的结构?

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        IUnityContainer container = new UnityContainer();

        UnitOfWork myUnitOfWork = new UnitOfWork();
        container.RegisterInstance<UnitOfWork>(myUnitOfWork);

        Window1 w1 = new Window1();
        w1.Show();
    }
}

我通过了建议的教程。对于我应该如何配置属性注入,我仍然不清楚。

我的viewmodel应该注入Window 1类,所以我假设我必须创建一个依赖属性。

 private DeviceViewModel viewModel;

    [Dependency]
    public DeviceViewModel ViewModel
    {
        get { return viewModel; }
        set { this.DataContext = value; }
    }

我如何将我的viewmodel注入到窗口1中,知道DeviceViewModel依赖于DeviceService并再次依赖于UnitOfWork?

//CONSTRUCTOR
    public DeviceViewModel(DeviceService service)
    {  
        Service = service;
        SearchCommand = new SearchCommand(this);
    }

private UnitOfWork myUnit;

    public DeviceService(UnitOfWork unit)
    {
        myUnit = unit;
    }

2 个答案:

答案 0 :(得分:2)

您需要告诉容器如何构建其他对象所需的所有对象,然后容器将在需要时实例化所需的任何对象。

您的房产注入只缺少一行:

private DeviceViewModel viewModel;

[Dependency]
public DeviceViewModel ViewModel
{
    get { return viewModel; }
    set { viewModel = value; this.DataContext = viewModel; }
} 

然后你OnStartup()

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    IUnityContainer container = new UnityContainer();

    container.RegisterType<UnitOfWork>();
    container.RegisterType<DeviceService>();
    container.RegisterType<DeviceViewModel>();

    Window1 w1 = container.Resolve<Window1>();
    w1.Show();       
}

您可以在RegisterType()中使用不同的参数,因此您可以控制对象的生命周期和创建。

答案 1 :(得分:0)

您需要完成此示例:http://visualstudiogallery.msdn.microsoft.com/3ab5f02f-0c54-453c-b437-8e8d57eb9942

你是在正确的轨道上,只是你应该解决窗口,而不是新的。

//instead of Window1 w1 = new Window1();
Window1 w1 = container.Resolve<Window1>();
w1.DataContext = container.Resolve<DeviceViewModel>();

Window1将不再需要设置自己的DataContext