我想知道在项目中定义名称空间的更好方法。我们有两个不同的winform项目,并且我们在两个项目中都使用了某些代码文件和表单。所以项目1和2的结构如下:
//Project Pro1
//-------------------------------------
//Class C1 starts
#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
Method M1
{
call to C2.M2
}
}
//Class C2 starts
namespace pro1
{
Class C2
Method M2
}
//Project Pro2
//----------------
#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
Method M1
{
call to C2.M2
}
}
namespace pro2
{
Class C2
Method M2
}
所以在这里,类C1(在名称空间common_fun下)是两个项目中使用的共享文件。但是,我们需要调用C2类的方法M2,并且为了调用该方法,我们需要在顶部编写条件使用语句。即。
#if pro1
using pro1
#elseif pro2
using pro2
#endif
所以我的问题是有没有更好的方法来包含常用文件的命名空间?因为将来可能有3-4个项目将使用相同的类/表格。
感谢。
答案 0 :(得分:1)
我会创建一个包含M2方法的通用界面:
interface ICommonFun
{
void M2();
}
然后将该接口的实现传递给您的C1
类:
class C1
{
ICommonFun Instance;
public void M1()
{
Instance.M2();
}
public C1(ICommonFun fun)
{
Instance = fun;
}
}
答案 1 :(得分:1)
我们在两个项目中都使用了某些代码文件和表单。
如果我理解正确,您可以在两个项目中引用这些代码文件,而不是将它们放入单独的程序集中。如果你试图将你的“公共类”放在这样的库中(因为这是编写可重用代码时的最佳实践),你会注意到编译器/链接器不允许你这样做:相反,它会告诉过你这里有什么:C1和C2的所有变体之间的循环依赖。在创建要在不同项目之间共享的代码时,您应该真正避免这种情况,因为它们使代码难以测试并且难以维护(您已经注意到它,因为您的命名空间问题是可能发生的典型问题之一)情况)。
sacklpicka的解决方案(使用界面)是解决此问题的一种方法,使C1可以放入其自己的库中。另一个是简单地在M2
的构造函数中将C1
作为委托传递,或者给C1
一个在调用M1时触发的事件,因此C1的用户可以注册他们的方法{ {1}}作为事件处理程序。