c# - 防止接口(interface)在其他程序集中实现

标签 c#

我在程序集 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/

相关文章:

c# - 如何在 Microsoft.NET 中使用 Mono.CSharp 解释器

c# - 如何将 html 绑定(bind)到 rdlc 文件

c# - 为什么 List<T> 的 Enumerator 是公开的?

c# - MQTT 与 XMPP 我应该选择哪个?

C#:Random.NextDouble 并包括自定义间隔的边框

c# - T4 在项目之间复制枚举

c# - 从 C++、反向 P/Invoke、混合模式 DLL 和 C++/CLI 调用 C#

c# - 如何将文件编码从 windows-1251 更改为 utf-8

c# - 从内容页访问 MasterPage 上 UserControl 的属性

c# - 我可以在 SQL Server 数据库中保存 'Object' 吗?