限制访问需要从其他部件指定的特性的正确方法是什么

本文关键字:是什么 方法 访问 其他部 | 更新日期: 2023-09-27 17:58:46

例如,我在程序集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; }
}

这有点让人觉得yicky不得不使用编译器选项来实现这一点。所以,我的问题是:

  • 在这种情况下可以使用InternalsVisibleTo吗
  • 我应该公开这处房产,希望没有人做任何改变吗
  • 我应该这样做吗

我的最终目标是,有人,可能只有我和我的团队,应该能够使用Message,但必须确保ID等属性永远不会从管理它们的类之外更改。然而,我们仍然需要创建消息之类的实例

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

限制访问需要从其他部件指定的特性的正确方法是什么

我的最终目标是,有人(可能只有我和我的团队)应该能够使用Message,但要确保ID等属性永远不会从管理它们的类之外更改。然而,我们仍然需要创建消息之类的实例。

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

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

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

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

在调用构造函数时,为什么不使用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());

我可能会更进一步,创建一个静态工厂方法:

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());    

现在我可以完全控制对象实例的创建,并且一旦创建就不能修改。