C# 项目之间的可访问性问题

C# 项目之间的可访问性问题,c#,.net,C#,.net,我有两个图书馆项目:一个项目和一个B项目,还有一个web项目:WebProject。 项目有一个类: public class WorkerManager { public Worker Get(long workerId) { .... .... } public Worker Get(Guid companyId, long workerId) { .... .... } } 我希望BProj

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

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

    public Worker Get(Guid companyId, long workerId) {
        ....
        ....
    }
}
我希望BProject中的类能够使用Worker Get的第一个版本:

WorkerManager  a=new WorkerManager ();
a.Get(8);
我想在web项目中隐藏这个方法

如果我将
Worker Get(long workerId)
设置为内部,则BProject将无法使用此方法,如果我将其公开,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);
}
项目C中的WorkerManager实现了接口:

public class WorkerManager : IWorkerManager {...}
new WorkerManagerFactory().Get().Get(workerId);
现在Project A可以通过工厂生产
IWorkerManager
s,因此您的Web项目永远不必说
new WorkerManager()

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

new WorkerManager().Get(compGuid, workerId);
。。。但是Web Project只能访问接口定义的内容:

public class WorkerManager : IWorkerManager {...}
new WorkerManagerFactory().Get().Get(workerId);
这说明了一种方法,你可以实现你所寻找的。通过利用依赖项注入,您可以找到更好的解决方案,但这种解释已经远远超出了原始问题的范围。

您可以使用并使该方法成为内部方法

但我不确定这是一个好的设计,用这种方式隐藏方法。如果只是一个实现细节,那么它应该是私有的。如果它是课堂公开的一部分,它应该对每个人公开。这两者之间没有太多空间(忽略派生类和受保护的成员)


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

使用接口将帮助您分离concerns@IAbstract:你能举个例子吗?如果这是VB.NET而不是C#,你可以在VB中使用关键字。NET@icemanid,这似乎与C#的
internal
完全相同。有解决方案,你把他们都打倒了。为什么web项目不使用程序集如此重要?如果您不想使用程序集,就不要添加对它的引用。这并不复杂。如果这是一种复杂的许可证制度,那么就买你想要的保护。它看起来非常复杂。它说“您必须明确指定输出文件的名称”。如何知道给BProject assembly取哪个名称?。项目和BProject是我的域的一部分,web是演示文稿的一部分。我希望演示部分的程序员将提供companyId,并仅与“Worker Get(Guid companyId,long workerId)”一起使用,其中其他域项目将能够直接获取Worker,而无需传递companyId变量(因为这样做将迫使我传递此变量,从而使每个函数都被卡住)。