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