基于面向对象原则的C#依赖注入

基于面向对象原则的C#依赖注入,c#,dependency-injection,C#,Dependency Injection,我在用C#编写基本依赖项注入时遇到了一个问题 我有一个接口IStorage,其中包含IObject-GetObject(int-objID) 然后我有两个windows窗体: 弗里曼 FRM研究 frmMain包含以下代码: private readonly IStorage newStorage; public frmMain() { newStorage = new Storage(); } frmSearch包含以下代码: public frmSearch(IStorage ne

我在用C#编写基本依赖项注入时遇到了一个问题

我有一个接口IStorage,其中包含IObject-GetObject(int-objID)

然后我有两个windows窗体:

  • 弗里曼
  • FRM研究
frmMain包含以下代码:

private readonly IStorage newStorage;


public frmMain()
{
newStorage = new Storage();
}
frmSearch包含以下代码:

public frmSearch(IStorage newStorage)
{
}
但是,我收到了错误:

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

解决这个问题的方法是公开接口,但这也迫使我公开对象类。我是OOP新手,这让我觉得将所有类和接口公开是一种糟糕的编码实践(我肯定是错的),所以我不太确定该怎么做


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

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

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

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


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

如果您担心的是您的类/接口可以在当前程序集外部引用,然后查看内部访问修饰符:

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

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


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

我认为标记
is不是一个坏主意存储
作为一个公共接口。我的问题是,我必须将任何IStorage方法中引用的所有类也公开,这还可以吗?相关代码(
接口IStorage
)未发布。IStorage包含的所有对象都是IObject GetObject(int-ObjID)因此,也要将
ioobject
公开。拥有一些私有实现是可以理解的,但我不认为拥有公共接口有什么害处。我认为将
IStorage
标记为公共接口不是一个坏主意。我的问题是,我必须将任何IStorage方法中引用的所有类公开还有,这还可以吗?相关的代码(
接口历史记录
)没有发布。历史记录包含的所有内容都是IObject GetObject(int-ObjID),所以也要将
IObject
公开。有一些私有实现是可以理解的,但我不认为有公共接口有什么害处。