限制访问需要从其他部件指定的特性的正确方法是什么
本文关键字:是什么 方法 访问 其他部 | 更新日期: 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
并定义ID
和Parent
?
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());
现在我可以完全控制对象实例的创建,并且一旦创建就不能修改。