2017-12-30 6 views
0

Unity 5와 Prism 7에서 프로그램을 만들고 있습니다. 프로그램을 모듈 식으로 만들어서 일부 모듈을 사용할 수없는 경우 제대로 작동하게하고 싶습니다.Unity 프레임 워크가 OptionalDependency를 해결하지 못합니다.

이 경우 나는 [OptionalDependency] 속성으로 선택적 종속성을 표시하고 null이 생성자에 전달되면 수행 할 작업을 스스로 결정하도록합니다.

그러나이 속성을 사용하여 종속성을 표시하면 Unity는 모듈을 사용할 수 있음에도 불구하고이를 해결하지 않고 종속성 인스턴스 대신 null을 전달합니다.

내가 어떻게 의존성을 실제로 만들 수 있습니까? 가지고있어 좋은가?

또는 다른 옵션

는 어떻게 의존성를 해결할 수없는 경우에을 던져, 그냥 대신 null을 전달하고 구성하는 클래스가 무엇을해야할지 결정하지 에 통일을해야합니까?

내 프로그램의 App.xaml.cs있다 : 나는 프리즘 + 유니티에서 멍청한 놈이기 때문에

public partial class App : PrismApplication 
{ 
    protected override Window CreateShell() 
    { 
     InitializeModules(); 
     this.ShutdownMode = ShutdownMode.OnMainWindowClose; 
     var shell = Container.Resolve<Shell>(); 
     this.MainWindow = shell; 
     return shell; 
    } 

    protected override void RegisterTypes(IContainerRegistry containerRegistry) { } 

    /// <summary> 
    /// Creating catalog of Modules from .dlls in "Modules" folder 
    /// </summary> 
    protected override IModuleCatalog CreateModuleCatalog() 
    { 
     var catalog = new DirectoryModuleCatalog() { ModulePath = @"./Modules" }; 
     catalog.Initialize(); 
     // by the way, modules aren't getting recognized without 
     // catalog.Initialize() or InitializeModules in CreateShell. 
     // Should it be such as that? Seems to me like no.. 
     return catalog; 
    } 
} 

주요 질문 옆에, 내가 질문 아래의 의견에 더 나은 내 코드를 만드는 방법에 대한 어떤 제안을 주셔서 감사합니다. 고맙습니다!

답변

0

이 접근법은 좋은 생각이 아닙니다. 생성자 삽입은 종속성이 필요함을 의미합니다. 또한 OptionalDependencyAttribute가 ctor에서 작동하지 않지만 속성에 적용되어야한다고 생각합니다. 속성을 만들고 속성을 적용 해보십시오.

CreateShell 메서드의 모든 코드는 필요하지 않습니다. 그냥 return Container.Resolve<Shell>() 그게 전부입니다.

또한로드되지 않은 모듈은 수정되었으며 MyGet의 최신 Prism CI에서 사용할 수있는 버그입니다.

+0

왜 OptionalDependency 속성을 매개 변수에 적용 할 수 있습니까? 생성자 매개 변수 옆에 매개 변수를 표시하는 다른 용도는 없습니다. 그리고 Prism 7.0.0.344-ci로 MyGet으로 옮겼고, CreateShell에서 InitializeModules();없이 쉘의 뷰 모델 생성자에 필요한 모듈 중 하나를 해결할 수 없기 때문에 여전히 동작하지 않습니다. – 1valdis

+0

또한 IModule 및 모듈 기능 구현 자체가 엄격하게 다른 클래스에 있어야하므로 기능이 사용 된 컨테이너에 종속되지 않습니다. 그러나 속성 주입은 내 서비스가 IModule이거나 속성을 가져 오는 데 대한 참조가 있어야 함을 의미합니다. 내가 무엇을 선택해야하며 다른 방법이 있습니까? – 1valdis

+0

Unity 팀에 속성 동작에 대해 물어봐야 할 것입니다. 당신이 재산으로 바꾼다면 그것은 깨졌습니까? 셸이 모듈보다 먼저 만들어집니다. 셸에서는 모듈 서비스를 요청할 수 없습니다. 셸에 종속성이있는 경우 모듈이 아닌 셸 프로젝트에 등록해야합니다. 다른 질문을 이해할 수 없습니다. 코드 냄새가 나처럼 들리는군요 (디자인에 문제가 있습니다). –

관련 문제