1

私はNinjectに少し慣れていないので、これが可能であるかどうか、そしてそれを行う方法は言うまでもなく、うまくいくのに少し問題があります。

基本的に、実行時にロードされるプラグインdllの数を含むディレクトリが必要です。dll内のすべてのプラグインは、2つ以上のインターフェイスを実装します。最初のインターフェースはIPluginであり、プラグインを初期化して停止するためのメソッドが含まれます。残りのインターフェースは、プラグインが提供/実装する機能のインターフェースになります。それらのインターフェースの1つを実装するものが必要な場合は、その機能/インターフェースを実装するすべてのプラグインのインスタンスをninject / plugin managerに要求して、それらを呼び出すことができるようにします。もう1つの問題は、各プラグインの単一インスタンスをロードして返す必要があるため、プラグインが3つのインターフェイス/機能を実装している場合、それらの機能/インターフェイスのいずれかを要求するたびに単一インスタンスが返されることです。

最後に、config xmlファイルやハードコードされたマッピングを使用しない場合と同様に、これをすべて動的に実行する必要があります。また、可能であれば、ninjectを使用してコンストラクターのプロパティを設定したいと思いますが、それが難しすぎる場合は、IPluginインターフェースのメソッドを介してそれを行うことができます。

私はこれが少し複雑であることを知っていますが、誰かが私を助けてくれるか、少なくとも私を正しい方向に向けてくれることを望んでいます。プラグインシステムに関する他のほとんどの投稿を見てきましたが、それらは共通のインターフェースに基づいています。私の場合、共通のインターフェースはセットアップ専用で、残りのインターフェースは異なるため、どれも一致していないようです。また、可能であれば、プラグインがninjectを参照することを望んでいませんでした。

これまで私は以下を試しましたが、うまくいくようですので、プラグイン間の依存関係を今すぐ行う必要があります

public class PluginManager:IDisposable
{
    IKernel kernel;

    public PluginManager()
    {
        kernel = new StandardKernel();

        kernel.Bind(
               x => x.FromThisAssembly()
                     .SelectAllClasses().InheritedFrom<IPlugin>()
                     .BindAllInterfaces()
                     .Configure(c =>c.InSingletonScope()));


    }

    public T GetPluginInstance<T>()
    {
        return kernel.Get<T>();
    }

    public IEnumerable<T> GetAllPluginInstances<T>()
    {
        return kernel.GetAll<T>();
    }

    public void Dispose()
    {
        kernel.Dispose();
    }
}
4

1 に答える 1

0

少しばかげているように感じますが、最初の投稿に編集した上記の最初の試みは非常にうまく機能し、コンストラクターなどのプラグイン間の依存関係を処理します.同様のことをしようとしているが、Ninjectをよく知らない他の人への回答。

public class PluginManager:IDisposable
{
    IKernel kernel;

    public PluginManager()
    {
        kernel = new StandardKernel();

        kernel.Bind(
               x => x.FromThisAssembly()
                     .SelectAllClasses().InheritedFrom<IPlugin>()
                     .BindAllInterfaces()
                     .Configure(c =>c.InSingletonScope()));


    }

    public T GetPluginInstance<T>()
    {
        return kernel.Get<T>();
    }

    public IEnumerable<T> GetPluginInstances<T>()
    {
        return kernel.GetAll<T>();
    }

    public void Dispose()
    {
        kernel.Dispose();
    }
}
于 2012-11-20T01:15:34.097 に答える