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 之类的属性永远不会从管理它们的类之外更改。但是,我们仍然需要创建消息等实例。

我的最终目标是我和我的团队应该能够在第三个程序集(程序集 C)中从 Message 继承。程序集 C 只知道程序集 A。程序集 B 稍后会动态加载。C 将使用 A 提供的接口向 B 发送消息。

4

3 回答 3

5

我的最终目标是某个人,可能只是我和我的团队,应该能够使用消息,但强制诸如 ID 之类的属性永远不会从管理它们的类之外更改。但是,我们仍然需要创建消息等实例。

在这种情况下,一种常见的方法是实际使用消息接口,然后在 AssemblyB 中实现该接口。

这允许您创建消息,但以后不能修改,因为您仍然可以完全控制实现。

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

然后你的其他程序集可以用一个私有类来实现它,并返回适当的消息,而不用担心它会被修改。

于 2013-02-11T16:54:10.317 回答
1

为什么不在调用构造函数时使用private set和定义IDandParent呢?

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 回答