0

タスク実行管理およびレポートサービスとして動作するWindowsサービスでホストされるwcfWebサービスを開発したいと思います。各タスクは.netアセンブリとして表され、タスク名とdllパスは中央構成になります。タスクには、少なくともExecuteメソッドとStopメソッドが主に含まれます。wcfサービスの実行中および他のタスクの実行中に、タスクのロード、実行、停止、およびアンロードが可能である必要があります。各タスクの1つのインスタンスを同時に実行できます。例外がある1つのタスクは、他のタスクを中止してはなりません。私は次のような方法を考えています

[OperationContract]    
bool Load(string taskName);
[OperationContract]
bool Run(string taskName);

このロードとアンロードのタスクをオンデマンドで実行し、分離する方法を考えています。一部のオプションでは、Reflection、MAF(System.Addin)などを使用します。このロード/アンロードは非常にまれにしか発生しないため、ロードに対する初期のパフォーマンスヒットは許容範囲内です。

この目標を達成するための最良の方法(ライブラリ、API、フレームワークなど)は何ですか。

4

2 に答える 2

1

最善については言えませんが、唯一の(!)アプローチには複数のアプリドメインが含まれます。アセンブリをアンロードすることはできず、appdomainのみをアンロードできるため、タスクに属するすべてのアセンブリを別のappdomainにロードする必要があります。

これを行うのは技術的に非常に簡単です。悪魔は詳細に宿っています。MAFはそのための良いフレームワークかもしれません。

于 2011-05-09T08:09:01.097 に答える
0

提供された各アセンブリが実装する必要のあるインターフェイスを定義するだけです。

パイプラインの動作を実装するプロジェクトに取り組んでいます。このコードスニペットは役立つかもしれません。linqを使用して、ロードされたすべてのアセンブリで、特定のインターフェイスを実装し、空のコンストラクターとカスタム属性を持つクラスを検索します(カスタム属性部分は必要ありません)-そして、見つかった各アイテムのインスタンスをインスタンス化します。

これがあなたが求めているものではないことを感謝しますが、うまくいけば、それはあなたを正しい方向に向けるでしょう-それが役立つことを願っています:)

        var processingModules = from mod in
                                   AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly =>
                                   {

                                       return from t in assembly.GetTypes()

                                              where 
                                                    t.GetInterfaces().Contains(typeof(IProcessingModule<T>))
                                                    && t.GetConstructor(Type.EmptyTypes) != null
                                                    && t.GetCustomAttributes(typeof(ProcessModuleAttribute), true)
                                                           .Cast<ProcessModuleAttribute>()
                                                           .Select(e => e.Processes.Contains(manager.Name))
                                                           .Contains(true)

                                              select Activator.CreateInstance(t) as IProcessingModule<T>;
                                   })
                                   orderby mod.ModuleOrder
                                       select mod;
于 2011-05-09T07:48:43.433 に答える