1

在阅读了 Unity 框架的文档后,我感到很困惑。 关联

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

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

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

我的视图模型应该注入到 Window 1 类中,所以我假设我必须创建一个依赖属性。

 private DeviceViewModel viewModel;

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

我如何将我的视图模型注入窗口 1,知道 DeviceViewModel 依赖于 DeviceService 并再次依赖于 UnitOfWork ?

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

private UnitOfWork myUnit;

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

2 回答 2

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() 中使用不同的参数,因此您可以控制对象的生命周期和创建。

于 2013-01-07T16:19:27.593 回答
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

于 2013-01-06T18:58:57.623 回答