2012-11-16 3 views
0

이 내용을 이해할 수 없습니다. Unity 생성자 종속성 주입을 사용하는 MVVM 패턴을 사용하는 WPF 응용 프로그램이 있습니다. 이 응용 프로그램에서는 사용자 지정 컨트롤을 사용합니다. 모든 것이 처음에는 잘되었습니다. 메인 윈도우에 컨트롤을 추가했는데 VS 디자이너에서 잘 보였습니다. 그런 다음 컨트롤이 유용하게 사용할 수 있도록하고 싶었습니다. 이렇게하려면 데이터 공급자가 필요했습니다. 나는 그것을 제공하는 가장 좋은 방법은 공급자를 생성자에 종속물로 추가하는 것이라고 결론을 내렸다.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

VS 디자이너는 new를 사용하여 디자이너에서 컨트롤을 만드는 인수가없는 생성자를 호출하려고 시도합니다. 그것은 당신의 컨테이너에 대해 아무것도 모르고 해결하려고 시도하지 않을 것입니다. 또한 디자이너는 App.Unity 속성을 사용할 수 없으며 설정 코드도 실행하지 않습니다.

해당 생성자를 사용할 때 컨테이너를 통해 해결하기보다는 stubbed 된 디자인 타임 전용 데이터 공급자를 사용하도록 컨트롤의 생성자를 변경하는 것이 가장 좋습니다.

+0

나는 내 질문에 답하는 것을 귀찮게 한 유일한 사람이기 때문에 대답을 표시하고 있습니다. 결국, 컨트롤의 의존성에 대한 속성 주입을 사용하기로 결정했습니다. 이는 정상적으로 작동하는 것 같습니다. 유니티를 사용하도록 설계자를 구성하는 고유 한 방법이 있어야한다고 생각되지만 어쩌면 그럴 수도 있습니다. – gregsdennis

+0

나는 이것에 대해서도 생각하고있다. 현재 WinRT Xaml에서 작업 중이며 휴대용 라이브러리에 있어야하는 몇 가지 사용자 지정 컨트롤이 있습니다. 즉, 장치 별 DLL에 의존해서는 안됩니다. 이제 내 컨트롤 중 일부는 클립 보드와 같은 장치 특정 클래스를 다룹니다. 그래서 맞춤 텍스트 상자와 같은 일부 맞춤 컨트롤에서 DI를 수행해야합니다. 이걸 가진 행운이야? – Lance

관련 문제