项目之间的可访问性问题

本文关键字:问题 访问 之间 项目 | 更新日期: 2023-09-27 18:02:41

我有两个图书馆项目:AProject和BProject,还有一个web项目:WebProject。
项目有一个类:

public class WorkerManager {
    public Worker Get(long workerId) {
        ....
        ....
    }
    public Worker Get(Guid companyId, long workerId) {
        ....
        ....
    }
}

我希望类从BProject能够使用工人的第一个版本得到:

WorkerManager  a=new WorkerManager ();
a.Get(8);

我希望这个方法在web项目中是隐藏的。

如果我使Worker Get(long workerId)内部,那么b项目将无法使用这个方法,如果我使它公开,web项目可以访问这个方法。

如何阻止访问web项目而允许访问b项目?

项目之间的可访问性问题

听起来你需要友元程序集。

它们基本上允许你使你的类内部,但指定BProject应该访问AProject的内部类。

更新

我从来没有真正使用过友元程序集,所以我不能给你比谷歌更好的指导。

其他人提到过使用接口,我同意这通常是一种好方法。但是,它是否适用于您将取决于您的代码结构。假设你将WorkerManager类移动到一个新的项目(C)。项目C依赖于项目b。项目a依赖于C和b。WebProject依赖于a和b。

         /-------------'
WebProject -> A -> C -> B
               '-------/

项目B现在定义了如下接口:

public interface IWorkerManager 
{
    public Worker Get(long workerId);
}

和WorkerManager在Project C实现接口:

public class WorkerManager : IWorkerManager {...}

现在项目A可以通过工厂生产IWorkerManager s,所以你的Web项目永远不必说new WorkerManager()

public class WorkerManagerFactory
{
    public IWorkerManager Get() {return new WorkerManager();}
}

现在项目A仍然可以访问其他方法:

new WorkerManager().Get(compGuid, workerId);

…但是Web Project只能访问由接口定义的内容:

new WorkerManagerFactory().Get().Get(workerId);

这说明了一种方法,你可能会达到你正在寻找。您可以通过利用依赖注入找到更好的解决方案,但是这种解释远远超出了最初问题的范围。

您可以使用InternalsVisibleTo属性并使方法为internal

但是我不确定这是一个好的设计,这样隐藏方法。如果它只是一个实现细节,它应该是私有的。如果它是类的公共表面的一部分,它应该对所有人公开。它们之间没有太多的空间(忽略派生类和受保护成员)。

在单元测试私有功能的情况下,这是很有用的。可能还有其他用途,但它们应该是非常罕见的。