我在程序集 C 中有以下内容:
public interface InterfaceA
{
string Data {get; }
}
public interface InterfaceB
{
InterfaceA DoStuff();
}
public interface InterfaceC
{
IEnumerable<InterfaceA> GetStuffThatHaveBeenDone();
}
InterfaceB 的一个实现,称为 Doer,在程序集 A(这是主项目)中定义。 类似地,在 AssemblyA 中定义了 InterfaceA 的实现,但程序集 B 对这些实现一无所知。
程序集 B 将由外部公司开发,并由程序集 A 引用(在设计时不是动态引用)。这家公司的目的是为 InterfaceC 编写一个实现。
情况是这样的:我想阻止外部公司创建自己的 InterfaceA 实现并将其放入他们在 InterfaceC.GetStuffThatHaveBeenDone() 中返回的列表中。预期用途是:他们调用 InterfaceB.DoStuff(),获取 InterfaceA 的实例,并将其添加到他们将返回的列表中。
我必须假设 InterfaceC.GetStuffThatHaveBeenDone() 返回的列表中包含的对象类型。我知道它们都将具有仅在程序集 A 中定义的特定类型。因此,我试图确保这些对象仅在程序集 A 中创建,并且我想在编译时强制执行此操作以避免发现 MyCustomImplementionOfA 对象在列表中。
因此,我试图弄清楚如何防止接口(interface)在另一个程序集中实现。我在想,也许可以通过稍微重新考虑我的设计购买来解决这个问题,但我似乎没有找到。
谢谢
最佳答案
我喜欢 Eric 提出的使用不透明 token 的解决方案。
您还可以通过使用抽象类 代替InterfaceA
并将其构造函数设置为内部来实现这一技巧。
public abstract class ContractA
{
internal ContractA() {};
public abstract string Data {get; }
}
关于c# - 防止接口(interface)在其他程序集中实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569490/