4

たとえば、アセンブリAで次のコードを定義しています。

public abstract class Message
{
    public int ID { get; internal set; }
    public Message Parent { get; internal set; }
}

アセンブリBから、次のことを行う必要があります。

instanceOfMessage.ID = MethodToGetUniqueIDNumber();
instanceOfMessage.Parent = MethodToGetParent(); // Returns null /w no parent

現在、これを回避するためにInternalsVisibleToコンパイラオプションを使用しています。

[assembly:InternalsVisibleTo ("AssemblyB")]

// Namespace stuff here

public class Message
{
    public int ID { get; internal set; }
}

これを機能させるためにコンパイラオプションをいじらなければならないのは、ちょっと厄介な感じがします。だから、私の質問は次のとおりです。

  • この状況でInternalsVisibleToを使用しても大丈夫ですか?
  • プロパティを公開して、誰も何も変更しないことを希望する必要がありますか?
  • 私もこれを行う必要がありますか?

私の最終目標は、誰か、おそらく私のチームと私だけがメッセージを使用できるようにすることですが、IDなどのプロパティがそれらを管理するクラスの外部から変更されないようにすることです。ただし、メッセージなどのインスタンスを作成するのは私たちである必要があります。

私の最終目標は、私のチームと私が3番目のアセンブリであるアセンブリCでメッセージから継承できるようにすることです。アセンブリCはアセンブリAについてのみ知っています。アセンブリBは後で動的に読み込まれます。Cは、Aが提供するインターフェイスを使用してBにメッセージを送信します。

4

3 に答える 3

5

私の最終目標は、誰か、おそらく私のチームと私だけがメッセージを使用できるようにすることですが、IDなどのプロパティがそれらを管理するクラスの外部から変更されないようにすることです。ただし、メッセージなどのインスタンスを作成するのは私たちである必要があります。

このタイプの状況での一般的なアプローチの1つは、メッセージのインターフェイスを実際に使用してから、AssemblyB内にインターフェイスを実装することです。

これにより、メッセージを作成できますが、実装を完全に制御できるため、後で変更することはできません。

public interface IMessage
{
    int ID { get; }
    IMessage Parent { get;  }
}

そうすれば、他のアセンブリはこれをプライベートクラスで実装し、変更されることを恐れずに適切なメッセージを返すことができます。

于 2013-02-11T16:54:10.317 に答える
1

コンストラクターを呼び出すときに、とを使用private setして定義しないのはなぜですか?IDParent

public class Message
{
    public Message(int id, Message parent) // Message constructor taking in ID and parent from external
    {
        ID = id;
        Parent = parent;
    }

    public int ID { get; private set; }
    public Message Parent { get; private set; }
}

Messageクラス外からのこの電話。

Message instanceOfMessage = new Message(MethodToGetUniqueIDNumber(), MethodToGetParent());
于 2013-02-11T17:01:16.900 に答える
0

私はおそらくさらに一歩進んで、静的ファクトリメソッドを作成します。

public class Message
{
    public static Message CreateInstance(int id, Message parent)
    {
        // Add code here to check security of caller

        return new Message(id, parent);
    }

    private Message(int id, Message parent)  
    {
        ID = id;
        Parent = parent;
    }

    public int ID { get; private set; }
    public Message Parent { get; private set; }
}

メッセージのインスタンスを作成するには、次のように呼び出します。

Message instanceOfMessage = Message.CreateInstance(MethodToGetUniqueIDNumber(), MethodToGetParent());    

これで、オブジェクトのインスタンスの作成を完全に制御でき、一度作成すると変更できなくなります。

于 2013-02-11T17:18:56.017 に答える