项目之间的可访问性问题

时间:2011-07-18 21:28:34

标签: c# .net

我有2个图书馆项目:AProject和BProject以及一个网络项目:WebProject AProject有一个班级:

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项目并允许访问BProject?

2 个答案:

答案 0 :(得分:3)

听起来你需要Friend Assemblies

它们基本上允许您在内部创建类,但指定BProject应该可以访问AProject的内部类。

更新

我从未真正使用过朋友程序集,因此我无法为您提供比Google更好的方向。

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

         /-------------\
WebProject -> A -> C -> B
               \-------/

项目B现在定义了如下界面:

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

Project C中的WorkerManager实现了接口:

public class WorkerManager : IWorkerManager {...}

现在,项目A可以通过工厂生成IWorkerManager,因此您的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);

这说明了一种可以实现所需目标的方法。您可以通过利用依赖注入找到更好的解决方案,但这种解释远远超出了原始问题的范围。

答案 1 :(得分:0)

您可以使用InternalsVisibleTo attribute并制作方法internal

但我不确定这是一个好的设计,以这种方式隐藏方法。如果它只是一个实现细节,它应该是私有的。如果它是班级公共表面的一部分,它应该公开给每个人。它之间的空间不大(忽略派生类和受保护的成员)。

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