项目之间的可访问性问题
本文关键字:问题 访问 之间 项目 | 更新日期: 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
。
但是我不确定这是一个好的设计,这样隐藏方法。如果它只是一个实现细节,它应该是私有的。如果它是类的公共表面的一部分,它应该对所有人公开。它们之间没有太多的空间(忽略派生类和受保护成员)。
在单元测试私有功能的情况下,这是很有用的。可能还有其他用途,但它们应该是非常罕见的。