我有两个库项目: AProject和BProject,还有一个web项目: 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?
发布于 2011-07-19 05:31:51
听起来你需要Friend Assemblies。
它们基本上允许您将类设为内部类,但指定BProject应该能够访问AProject的内部类。
更新
我实际上从来没有使用过Friend Assemblies,所以我不能给你比谷歌更好的方向。
其他人也提到过使用接口,我同意这通常是一种好方法。但是,它是否适用于您将取决于您的代码结构。假设您将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 {...}现在项目A可以通过工厂生产IWorkerManager,因此您的网络项目永远不会说new WorkerManager()。
public class WorkerManagerFactory
{
public IWorkerManager Get() {return new WorkerManager();}
}现在,项目A仍然可以访问其他方法:
new WorkerManager().Get(compGuid, workerId);..。但是Web Project只能访问接口定义的内容:
new WorkerManagerFactory().Get().Get(workerId);这说明了一种你可以实现你想要的东西的方法。您可以通过利用依赖注入找到更好的解决方案,但这种解释远远超出了原始问题的范围。
发布于 2011-07-19 05:35:27
您可以使用InternalsVisibleTo attribute并使该方法成为internal。
但我不确定这是不是一个好的设计,以这种方式隐藏方法。如果它只是一个实现细节,那么它应该是私有的。如果它是类的公共界面的一部分,那么它应该对所有人公开。两者之间没有太多的空间(忽略派生类和受保护的成员)。
这可能有用的一种情况是单元测试私有功能。可能还有其他用途,但应该是相当罕见的。
https://stackoverflow.com/questions/6739703
复制相似问题