阅读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;
}
答案 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