我有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?
答案 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
。
但我不确定这是一个好的设计,以这种方式隐藏方法。如果它只是一个实现细节,它应该是私有的。如果它是班级公共表面的一部分,它应该公开给每个人。它之间的空间不大(忽略派生类和受保护的成员)。
这可能有用的一种情况是对私有功能进行单元测试。可能还有其他用途,但它们应该非常罕见。