Unity框架无法解决OptionalDependency

时间:2017-12-30 10:49:39

标签: c# unity-container prism

我在Unity 5和Prism 7上构建程序。我希望我的程序高度模块化,所以如果某些模块不可用,我希望它能正常运行。

为此,我想用[OptionalDependency]属性标记可选的依赖项,并让一个类与它们一起决定如果在构造函数中传递了null该怎么做。

但是如果我用这个属性标记一个依赖项,Unity就不会解析它而只是传递null而不是依赖实例,尽管模块像往常一样可用。

如何使依赖 非常好

或者另一种选择,当依赖关系无法解决时,如何让Unity 不抛出 ,只需传递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;
    }
}

除了主要问题,我感谢任何有关如何在问题评论中使我的代码更好的建议,因为我是Prism + Unity中的一个菜鸟。谢谢!

1 个答案:

答案 0 :(得分:0)

这种方法不是一个好主意。构造函数注入意味着需要依赖项。另外,我不认为OptionalDependencyAttribute在ctor中工作,而是必须应用于属性。尝试制作属性并将属性应用于该属性。

不需要CreateShell方法中的所有代码。只需return Container.Resolve<Shell>(),就是这样。

此外,未加载的模块是一个已修复的错误,可在MyGet上的最新Prism CI biuld中找到。