c# - 如何使用正确的可见性修饰符来实现这个类结构?

标签 c# class structure access-modifiers

我正在与几个人一起开发一个项目,并且希望对代码强制执行某种结构,而不必将其编写在某个地方并依赖每个人来记住并应用该概念。

我正在开发一个处理文件和数据的框架,我当前的结构是这样的(第一行是命名空间,第二行是类名)。

当前结构:

Current Structure

我的目的是让 FileManager 和 DataManager 仅对 EngineWorker 可用,这样外部任何人都不能直接使用它们,强制通过 EngineWorker 中的方法使用它们。我发现只有两种方法可以做到这一点,删除 static关键字并将 EngineWorker 内的实例设为私有(private),或者在所有情况下将所有类加入同一个程序集并更改 public 的访问权限至internal .

我希望有另一种方法,可以让我保持类静态和程序集不变。也许是因为它们都有相同的“父”命名空间 Product.FrameWork

最佳答案

我觉得这个问题真的很好,我来了across the same situation不久前,一直找不到完美的解决方案。

我能想到的一个解决方案是输入 EngineWorker , DataManagerFileManager在同一个项目(我们称之为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))。但我们还是要阻止外界使用DataManagerFileManager直接...为了实现这一点,我们创建了他们的方法(上例中的DoWork())intenal .

关于c# - 如何使用正确的可见性修饰符来实现这个类结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65452942/

相关文章:

c# - 在日历之间转换

c# - transient 故障重试逻辑最佳实践

java - 创建不同对象的实例列表

c - 从函数返回结构 (C)

c - 在多个文件中声明结构

c# - Azure Webjob 服务的 Microsoft.Azure.ServiceBus.Message 支持

java - 使用 int 然后递增它比同时做两者慢吗?

php - 从父类访问子变量?

java - 声明类会导致 StackOverflow 错误

c - 将结构从一个列表的末尾移动到另一个列表的开头