DI Unity AssemlyInformation.Title ModuleAttribute.ModuleName并根据需要/从目录加载模块

时间:2017-04-13 08:57:33

标签: c# unity-container prism

我开始使用prism + unity DI。到目前为止,我有两个问题和疑问。

1。问题/问题

我想将AssemblyInformation Title用作ModuleAttribute.ModelName。

问题: 这不起作用:

[Module(ModuleName = AssemblyName.GetAssemblyName(Assembly.GetExecutingAssembly().FullName).Name)]

这很有效。

[Module(ModuleName ="Module1")]

问题:

是否有可能将AssemblyInformation.Title用作ModuleAttribute.Modulename?

2。问题/问题

我想从Directory my Modules按需加载,但只能在模块名称中有特殊前缀的模块。

问题:

如果我检查我的ModuleCatalog,那么在我初始化模块之前它仍然是空的。

问题:

是否可以在模块初始化之前检查模块的名称,因为我不想在模块内部执行Initialize()方法。

我的引导程序:

    protected override IModuleCatalog CreateModuleCatalog()
            {
                return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
            }

            protected override void ConfigureContainer()
            {
                base.ConfigureContainer();
            }

            protected override void InitializeModules()
            {
                ModuleCatalog moduleCatalog = (ModuleCatalog) this.ModuleCatalog;
// Here I would like to discover my modules with special modulename prefix. 
//If the prefix is not found, then I dont want to init the module.

                try
                {
                    base.InitializeModules();
                }
                catch (DuplicateModuleException e)
                {
                }
}

模块:

    [Module(ModuleName = "MyPrefix-Module1")]
        public class PrismModule1Module : IModule
        {
            IRegionManager _regionManager;

            public PrismModule1Module(IRegionManager regionManager)
            {
                _regionManager = regionManager;
            }

            public void Initialize()
            {
               Debug.WriteLine("Module init");
            }
        }

1 个答案:

答案 0 :(得分:1)

  1. 没有这样的内置功能,因为通常模块是一个类(实现IModule接口),而程序集可能包含多个模块。
  2. 但是,这可以通过覆盖默认实现来实现。

    1. 您需要将模块标记为按需加载。您需要来初始化目录,以便读取模块信息(关于按需加载)。然后,您可以查询模块信息并实际加载模块。