7

WCF サービス内から Prism モジュール システムをブーストラップできますか? 何をしても、MEF の依存関係が満たされていないからです。

例えば:

これは私のWCF サービスの実装です

public class MyService : IMyServiceContract{
    // This should get filled by MEF after Prism loads the required modules
    [Import]
    IDatabase db;

    public MyService(){
        var bootsrapper = new MyServiceBoostrapper();
        bootsrapper.Run();
    }
}

これは、MEF 風味の私のPrism ブーストラップです。

public class MyServiceBoostrapper : MefBootstrapper
{
    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return new ConfigurationModuleCatalog();
    }
    protected override void ConfigureAggregateCatalog()
    {
        base.ConfigureAggregateCatalog();

        // TODO: Add this assembly ... don't know why
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyServiceBoostrapper).Assembly));
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(IDatabase).Assembly));
        // This is what provides the service
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(DatabaseImpl).Assembly));
    }

    protected override DependencyObject CreateShell()
    {
        // we don't need the shell
        return null;
    }

}

Database Prism serviceのインターフェースを含む私のモジュールは次のとおりです。

[ModuleExport(typeof(IDatabase))]
public class ModuleActivator : IModule
{
    public void Initialize()
    {
        // Do nothing as this module simply provides the API.
    }
}
public interface IDatabase
{
  // interface methods here ...
}

最後に、Prism データベース サービス自体を次に示します。

[ModuleExport(typeof(DatabaseImpl), DependsOnModuleNames = new string[] { "IDatabase" })]
public class ModuleActivator : IModule
{
    public void Initialize()
    {
        // Do nothing as this is a library module.
    }
}

[Export(typeof(IDatabase))]
public class DatabaseImpl : IDatabase
{
   /// implementation here ...
}

これを最後の数時間試しましたが、成功しませんでした。私のdbインポートは常にnull初期化されていません。

Prism を使用せずに、MEF のみを使用してこれらすべてを実行すると、すべてが機能することに注意してください。

4

3 に答える 3

1

次のスニペットが役立つかどうかはわかりません。私は PRISM と Unity の経験しかありません。試してみて、何が起こっているのか教えてください。

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

        this.RegisterTypeIfMissing(typeof(IDatabase), typeof(DatabaseImpl ), true);
    }

また、ModuleCatalog を作成して空にし、構成することはありません。

protected override void ConfigureModuleCatalog()
        {

            base.ConfigureModuleCatalog();

            var moduleCatalog = (ModuleCatalog)ModuleCatalog;

            Type Initial = typeof(ModuleActivator);
            moduleCatalog.AddModule(new ModuleInfo
            {
                ModuleName = Initial.Name,
                ModuleType = Initial.AssemblyQualifiedName
            });
        }
于 2013-05-27T13:54:55.330 に答える
0

モジュールに「モジュラー」を追加しないため、解決策は Prism をまったく使用しないことのようです。モジュールは純粋に視覚的なアプリケーションの概念のようです。

代わりに、WCF の「スタートアップ」手順にフックし、そこから MEF コンテナーをブーストラップする必要があります。WCF には既に多くの拡張/フックイン ポイントがあるため、これを行う方法に関する答えはかなり複雑です (複雑ではありません)。

私が使用した答えは、第 7.3 章「WCF アプリケーションの作成」の Mark Seemann による本Dependency Injection in .NET にあります。

その本の章全体をこの回答にコピーすることを除けば、それが私にできる最善のことだと思います。

于 2013-06-03T03:40:46.230 に答える