防止接口在其他程序集中实现

tob*_*777 4 c#

我在程序集 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 对象在列表中。

因此,我试图找出如何防止接口在另一个程序集中实现。我想也许可以通过稍微重新思考我的设计来解决这个问题,但我似乎没有找到。

谢谢

ale*_*exm 5

我喜欢 Eric 提出的不透明令牌的解决方案。您还可以通过使用抽象类代替您的抽象类InterfaceA并将其构造函数设置为内部来实现此技巧。

public abstract class ContractA
{
   internal ContractA() {};
   public abstract string Data {get; }

}
Run Code Online (Sandbox Code Playgroud)