1

(設定ファイル内の)dllのリストを見て、それらをすべてロードし、独自のスレッドで各dllの特定のメソッドを開始するWindowsサービスがあります。これらの各 dll は、このサービスで使用するために特定のクラス (Module クラス) から継承する必要があり、そのクラスの一部は MPI オブジェクトです。これは基本的に、dll メソッドがメソッドを呼び出して直接対話できるようにするクラスのインスタンスです。サービス。方法は次のとおりです。

  1. サービスが dll をロードします
  2. リフレクションを使用して、Module クラスを継承するクラスがあることを確認します
  3. その Module 継承クラスの新しいインスタンスを作成します
  4. MPI クラスの新しいインスタンスを作成します。これには、どのモジュールがそれを使用しているかに関する識別情報があります
  5. 新しく作成された MPI オブジェクトを新しいモジュール クラスに割り当てます。
  6. モジュールのメインスレッドを開始します

基本モジュール クラス自体は独自の dll です (サービスと外部 dll の両方が動作できるようにするため)。私がやりたいことは、サービスが MPI オブジェクト (特別な値) を新しい Module クラスに割り当てられるようにすることですが、そのクラスが MPI オブジェクトの割り当てや値のいずれかを変更できるようにしたくありません。その中に。継承されたクラスの読み取り専用ですが、他のクラスから割り当て可能です。私は、これを可能にするためにどのような変更を加える必要があるか、どのようにセットアップしたかという方法でこれを行うことはできないと思います. それは可能ですか?

MPI は、メインのホスティング サービスの API のようなものです。エラーログなど、いくつかの集中化されたものを処理します。サービスが新しいモジュールをロードすると、ID が割り当てられます。そのモジュールが呼び出さMPI.ErrorLog(someStuff)れると、メイン サービス メモリへの参照を持ち、実際のエラー ライターにアクセスできる MPI は、この時点でモジュール ID # にこのエラーが発生したことを書き込みます。ID をモジュールを継承するクラスに対してプライベートにする必要がありますが、メイン サービスに対してではなく、それによって ID を設定できるようにします。モジュールが新しい MPI オブジェクト自体を作成し、これらを変更できるようにしたくないので、すべてを設定するコンストラクターでプライベート変数を言わないでください。

4

2 に答える 2

2

私が理解していることから、さまざまなコンテキスト/ユーザーの単一オブジェクトへのアクセスを変更したいと考えています。たとえば、「base」はgetおよびsetアクセサーについて認識しますが、「module」はgetアクセサーについてのみ認識します。ここでは、アクセス修飾子とインターフェイスの2つのオプションを想像できます。

まず、internal修飾子は、同じアセンブリ内のファイルにのみメンバーを表示します。

public class Mpi
{
    private int id;

    int Id
    {
        public get
        {
            return this.id;
        }
        internal set
        {
            this.id = value;
        }
    }
    //...
}

したがって、「モジュール」はこれが取得専用プロパティであると想定しますが、「ベース」は取得と設定の両方を行うことができます。

2番目のオプションは、getアクセサーのみを定義するインターフェースを持つことです。

public interface IMpi
{
    int Id { get; }
}

public class Mpi : IMpi
{
    public int Id { get; set; }
}

このモデルでは、「base」クラスがMpiオブジェクトを使用し、「module」クラスがIMpiオブジェクトを使用します。Idこれらは同じインスタンスですが、モジュールはプロパティにsetメソッドがあることを認識していません。

于 2013-02-13T04:21:38.353 に答える
0

あなたが持っていると仮定して:

var modules = from file in Directory.GetFiles(path, "*.dll").AsParallel()
              from type in Assembly.LoadFile(file).GetTypes().AsParallel()
              where !type.IsInterface && typeof(Module).IsAssignableFrom(type)
              select (Module)Activator.CreateInstance(type);

次に、Module基本クラスを宣言します。

public abstract class Module
{
    public abstract Mpi Mpi { get; set; } // to inherit you must implement getter (you don't need it) and setter (what you're asking about)

    public abstract void Main(); // to inherit you must implement too
}

そして使用:

Mpi mpi = new Mpi();
foreach (Module m in modules)
{
     m.Mpi = mpi;
     m.Main();
}

別の解決策。基本クラスがパラメーターなしのコンストラクターを持っている場合、それは常に呼び出されます。内部では、基本クラスによってのみ書き込み可能な変数を割り当てることができます。

public abstract class Module
{
    protected Module()
    {
        this.Mpi = new Mpi();
    }

    protected Mpi Mpi { get; private set; } // getter is visible to children, setter only for class itself
}
于 2013-02-13T04:52:35.357 に答える