1

私はフロントオフィスアプリケーションを開発するためにmefでprism4.1を使用していますが、問題があります。モジュールのロードプロセス中に、アプリケーションが例外で失敗することがあります

ファイルまたはアセンブリ「Sl.Common.Model、バージョン= 1.0.0.0、カルチャ=ニュートラル、PublicKeyToken=null」またはその依存関係の1つを読み込めませんでした。指定されたファイルが見つかりません。

モジュールには依存関係があります(AuditModuleとLoadersModuleはCommonModuleに依存します)。

<Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                          xmlns:sys="clr-namespace:System;assembly=mscorlib" 
                          xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">

<!-- language: lang-xml -->    
    <Modularity:ModuleInfo  Ref="Sl.Common.Model.xap" InitializationMode="WhenAvailable" ModuleName="CommonModule"/>
    <Modularity:ModuleInfo Ref="Sl.Loaders.xap" ModuleName="LoadersModule">
        <Modularity:ModuleInfo.DependsOn>
            <sys:String>CommonModule</sys:String>
        </Modularity:ModuleInfo.DependsOn>
    </Modularity:ModuleInfo>
    <Modularity:ModuleInfo Ref="Sl.Audit.xap" ModuleName="AuditModule">
        <Modularity:ModuleInfo.DependsOn>
            <sys:String>CommonModule</sys:String>
        </Modularity:ModuleInfo.DependsOn>
    </Modularity:ModuleInfo>

</Modularity:ModuleCatalog>

アプリケーションは正常に起動することがありますが、上記の例外を除いて「CommonModule」が原因でAuditModuleまたはLoadersModuleを解決できない場合に問題が発生します。

public class Bootstrapper : MefBootstrapper
{
    private const string ModuleCatalogUri = "/ModerationSlUserInteface;component/ModulesCatalog.xaml";

    protected override void ConfigureAggregateCatalog()
    {
        base.ConfigureAggregateCatalog();
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StackPanelRegionAdapter).Assembly));
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        var catalog = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri(ModuleCatalogUri, UriKind.Relative));
        return catalog;
    }

    protected override DependencyObject CreateShell()
    {
        return this.Container.GetExportedValue<Shell>();
    }

    protected override void InitializeShell()
    {

        //base.InitializeShell();
        Application.Current.RootVisual = (UIElement)this.Shell;
    }

    protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
    {
        RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
        var stackPanelAdapterInstance = ServiceLocator.Current.GetInstance<StackPanelRegionAdapter>();
        mappings.RegisterMapping(typeof(StackPanel), stackPanelAdapterInstance);
        return mappings;
    }
}

コードはここから取得できます

PS In Shell.xaml.cs if(e.ModuleInfo.ModuleName == LoadersModuleName)でブレークポイントに到達したとき

最初のモジュールがCommonModuleの場合、アプリケーションは正常に起動します。それ以外の場合は例外として該当します。

[Export]
public partial class Shell : UserControl, IPartImportsSatisfiedNotification
{
    private const string LoadersModuleName = "LoadersModule";
    private static Uri LoadersViewUri = new Uri("/LoadersView", UriKind.Relative);

    public Shell()
    {
        this.InitializeComponent();
    }

    [Import(AllowRecomposition = false)]
    public IModuleManager ModuleManager;

    [Import(AllowRecomposition = false)]
    public IRegionManager RegionManager;

    public void OnImportsSatisfied()
    {
        this.ModuleManager.LoadModuleCompleted += (s, e) =>
        {
            if (e.ModuleInfo.ModuleName == LoadersModuleName)
            {
                this.RegionManager.RequestNavigate(RegionNames.MainRegion, LoadersViewUri);
            }
        };
    }
}
4

1 に答える 1

1

モジュール内の参照をエントリポイントプロジェクトにも追加する必要があることがわかりました。

したがってMicrosoft.Practices.Prism.UnityExtensionsAuditModule(たとえば)で参照する場合はMainProject、のコードで直接参照されていなくても、への参照を追加する必要がありますMainProject

于 2012-09-27T14:46:58.960 に答える