我无法想出这个。我有一个WPF应用程序使用MVVM模式和Unity构造函数依赖注入。在应用程序中,我使用自定义控件。一切都很好:我将控件添加到我的主窗口,它在VS设计器中显示就好了。然后我希望控件做一些有用的事情,为此,它需要一个数据提供者。我决定提供这种方法的最佳方法是将提供程序添加为构造函数中的依赖项。
那是一切都向南的时候。虽然程序按预期运行,但VS设计器无法实例化控件。我已经构建了一个简单的应用程序来说明我的困境。
MainWindow代码背后:
using System.Windows;
using System.Windows.Controls;
using Microsoft.Practices.Unity;
namespace DependencyInjectionDesigner
{
public interface IDependency { }
class Dependency : IDependency { }
class DependentControl : Control
{
public DependentControl()
: this(App.Unity.Resolve<IDependency>()) { }
public DependentControl(IDependency dependency) { }
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
MainWindow XAML:
<Window x:Class="DependencyInjectionDesigner.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DependencyInjectionDesigner"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type local:DependentControl}">
<Setter Property="Margin" Value="30"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DependentControl}">
<Border BorderBrush="Green" Background="Gainsboro"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<local:DependentControl/>
</Grid>
</Window>
应用代码背后:
using System.Windows;
using Microsoft.Practices.Unity;
namespace DependencyInjectionDesigner
{
public partial class App : Application
{
public static IUnityContainer Unity { get; private set; }
protected override void OnStartup(StartupEventArgs e)
{
if (Unity != null) return;
Unity = new UnityContainer();
Unity.RegisterType<IDependency, Dependency>(
new ContainerControlledLifetimeManager());
}
}
}
我认为问题是VS设计者在新的控件之前不知道注册IDependency类型。我对么?有没有办法解决这个问题?
我正在使用VS 2010 Ultimate和.Net 4.0。
答案 0 :(得分:0)
VS设计器将尝试使用new调用零参数构造函数来在设计器中创建控件;它一无所知,也不会尝试通过您的容器解决。此外,您的App.Unity属性不可供设计人员使用,也无法运行设置代码。
您最好将更改控件的构造函数更改为仅使用存根设计时数据提供程序,而不是在使用该构造函数时尝试通过容器解析。