我正在与几个人一起开发一个项目,并且希望对代码强制执行某种结构,而不必将其编写在某个地方并依赖每个人来记住并应用该概念。
我正在开发一个处理文件和数据的框架,我当前的结构是这样的(第一行是命名空间,第二行是类名)。
当前结构:
我的目的是让 FileManager 和 DataManager 仅对 EngineWorker 可用,这样外部任何人都不能直接使用它们,强制通过 EngineWorker 中的方法使用它们。我发现只有两种方法可以做到这一点,删除 static
关键字并将 EngineWorker 内的实例设为私有(private),或者在所有情况下将所有类加入同一个程序集并更改 public
的访问权限至internal
.
我希望有另一种方法,可以让我保持类静态和程序集不变。也许是因为它们都有相同的“父”命名空间 Product.FrameWork
?
最佳答案
我觉得这个问题真的很好,我来了across the same situation不久前,一直找不到完美的解决方案。
我能想到的一个解决方案是输入 EngineWorker
, DataManager
和FileManager
在同一个项目(我们称之为IO.Project)中,并将最后两个类设置为 internal
确保外界通过 EngineWorker
访问它们:
IO.Project
public class EngineWorker
{
private DataManager _dataManager;
private FileManager _fileManager;
/*
* The limitation of this approach is that the outside world does not know about
* the internal classes, so you cannot use constructor injection:
*
* public EngineWorker(DataManager dataManager, FileManager fileManager)
* {
* _dataManager = dataManager;
* _filerManager = FileManager;
* }
*/
// you can pass the internal dependencies into the constructor
public EngineWorker(DbContext dbContext, FileManagerDepencency fileManagerDependency)
{
_dataManager = new DataManager(dbContext);
_fileManager = new FileManager(fileManagerDependency);
}
// or you can use a Factory to instantiate EngineWorker
}
internal class DataManager
{
private _dbContext;
internal DataManager(DbContext dbContext)
{
_dbContext = dbContext;
}
internal void DoWork()
{
// do something
}
}
internal class FileManager
{
private _fileManagerDependency; // <-- if this class has any dependency?
internal FileManager(FileManagerDependency fileManagerDependency)
{
_fileManagerDependency = fileManagerDependency;
}
internal void DoWork()
{
// do something
}
}
这种方法的局限性是无法注入(inject)内部类,因为外界不知道它们...相反,您可以使用工厂/提供者来实例化 EngineWorker
...或者您可以将依赖项(例如 DbContext
)传递给构造函数并让 EngineWorker
构造函数实例化其内部成员。
另一个解决方案是将所有三个类设置为 public
(这样你就可以使用构造函数注入(inject))。但我们还是要阻止外界使用DataManager
和FileManager
直接...为了实现这一点,我们创建了他们的方法(上例中的DoWork()
)intenal
.
关于c# - 如何使用正确的可见性修饰符来实现这个类结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65452942/