【问题标题】:C# Dependency Injection with OOP Principles具有 OOP 原则的 C# 依赖注入
【发布时间】:2020-05-28 03:26:20
【问题描述】:

我在用 C# 编写基本依赖注入时遇到问题,

为了解决问题,我有一个接口 IStorage,其中包含 IObject GetObject(int objID)。

然后我有两个窗体:

  • frmMain
  • frm搜索

frmMain 包含以下代码:

private readonly IStorage newStorage;


public frmMain()
{
newStorage = new Storage();
}

frmSearch 包含以下代码:

public frmSearch(IStorage newStorage)
{
}

但是我收到了错误:

可访问性不一致:参数类型“Application.IStorage”的可访问性低于方法“Application.frmSearch.frmSearch(IStorage)”

解决这个问题的方法是公开我的接口,但这迫使我也公开对象类。我对 OOP 还很陌生,将我的所有类和接口公开(我肯定是错的)感觉像是一种糟糕的编码实践,所以我不太确定在这里做什么。

任何帮助将不胜感激。 :)

【问题讨论】:

  • 我认为将IStorage 标记为公共接口并不是一个坏主意。
  • 我的问题是,我必须将任何 IStorage 方法中引用的所有类也公开,这还可以吗?
  • 相关代码(interface IStorage)未贴出。
  • 所有 IStorage 包含的是 IObject GetObject(int ObjID)
  • 所以也要公开IObject。拥有一些私有实现是可以理解的,但我不认为拥有公共接口有什么害处。

标签: c# dependency-injection


【解决方案1】:

如果您担心您的类/接口可能会在当前程序集之外被引用,那么请查看内部访问修饰符:

https://docs.microsoft.com/it-it/dotnet/csharp/language-reference/keywords/internal

“内部访问的常见用途是在基于组件的开发中,因为它使一组组件能够以私有方式进行协作,而不会暴露给应用程序的其余代码。例如,用于构建图形用户界面的框架可以提供通过使用具有内部访问权限的成员进行协作的 Control 和 Form 类。由于这些成员是内部的,因此它们不会暴露给使用框架的代码。

在定义它的程序集之外引用具有内部访问权限的类型或成员是错误的。”

请记住,封装中存在层次结构,因此如果一个类(例如)具有公共可见性,则可以从实际程序集外部使用它的公共方法。然后,您必须小心避免让这些方法要求具有较低可见性的参数类型,否则会出现不一致。幸运的是,Visual Studio 会就此向用户发出警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多