我一直在寻找解决我们公司所遇到的复杂问题的方法。该公司是4个公司联盟的一部分,这些公司在四个“地区”覆盖我们的国家。 我们的分支在C#中开发了一个WebService,我们将这个项目分发给其他分支的开发人员。每个人都在自己的服务器中托管WebService。
现在,当公司不相处时,我一直在努力寻找你能期待的东西。我必须调整现有方法以适应我们的“区域需求”。
所以我上了这堂课:
public partial class MyClass{
public static ComplexReturnType MyMethod(){
// National code. Everyone uses this block of code.
}
}
我创建了一个Regional文件夹,在将DLL分发到其他分支时,我将从编译中排除该文件夹。在这个文件夹中,我创建了文件MyClass.cs,然后继续:
public partial class MyClass{
public static ComplexReturnType MyMethod(){
// Regional code. Only my commpany will use this.
}
}
在其他文件中调用方法MyMethod
。我理解partial
是如何工作的,但是如果不创建子类并重写其他文件中已存在的每个调用,我找不到适合我需要的解决方案。
有没有人知道如何处理这个?
回答后编辑
我决定使用策略设计模式,当我完成时,我想“如果分支决定覆盖任何方法,所有其他分支必须覆盖与其区域策略类中的国家代码相同的方法”
所以这不是很好。相反,我这样做了:
public class VStrategy
{
public virtual ComplexReturnType MyMethod(){
// National code. Method moved from MyClass
}
public virtual AnotherReturnType MySecondMethod(){
// National code. Method moved from MyClass
}
}
public class SomeBranchStrategy: VStrategy
{
public override ComplexReturnType MyMethod() {
// Regional code for overriding a method
}
}
public class AnotherBranchStrategy: VStrategy
{
public override AnotherReturnType MySecondMethod(){ {
// Regional code for overriding a method
}
}
public class MyClass
{
private static VStrategy _strategy = new VStrategy();
public static VSTrategy Strategy { get {...}; set {...} }
public static ComplexReturnType MyMethod()
{
return Strategy.MyMethod();
}
public static ComplexReturnType MySecondMethod()
{
return Strategy.MySecondMethod();
}
}
这样,没有接口,每个分支都可以覆盖他们想要的任何方法,而不会影响其他分支。您只需将方法代码移动到VStrategy类并在您自己的Regional类中覆盖它。
希望这有助于任何可能处于这种情况的人。
答案 0 :(得分:8)
public interface IStrategy
{
ComplexReturnType MyMethod();
}
public class NationalDefaultStrategy : IStrategy
{
public ComplexReturnType MyMethod() { }
}
public class BostonStrategy: IStrategy
{
public ComplexReturnType MyMethod() { }
}
public class MyClass
{
private static IStrategy _strategy = new NationalDefaultStrategy();
public static ISTrategy Strategy { get {...}; set {...} }
public static ComplexReturnType MyMethod()
{
return _strategy.MyMethod();
}
}
这样,您可以轻松更改运行时使用的策略
MyClass.Strategy = new BostonStrategy();
如果你把它变成一个实例方法而不是静态方法(我可能会)并决定使用像Castle Windsor这样的IoC容器,你甚至可以在配置文件中连接策略。
修改强>
逻辑上,每个分支都有自己的配置文件。使用这种方法有两个好处:
答案 1 :(得分:2)
您当前的方法存在一些问题。
实现上述建议的示例代码:
public class SharedClass
{
private readonly IRegionCode m_RegionLogic;
// Constructor with dependency injection
public SharedClass(IRegionCode mRegionLogic)
{
this.m_RegionLogic = mRegionLogic;
}
// Method called by the webservice
public void YourMethod()
{
// reused base logic here
Trace.Write("Somehting");
// Invoke region specific code
m_RegionLogic.Foo();
// reused base logic here
Trace.Write("Somehting");
}
}
// Contract for regions to implement
public interface IRegionCode
{
void Foo();
}
// Example of an injected class
public class FirstRegionCode : IRegionCode
{
public void Foo()
{
Trace.Write("Bar");
}
}
答案 2 :(得分:1)
我认为你误解了部分课程的用途!创建分部类只是意味着该类的源代码被拆分为单独的文件。将所有源代码写入同一文件没有区别,所以基本上你写的是:
public class MyClass{
public static ComplexReturnType MyMethod(){
// National code. Everyone uses this block of code.
}
public static ComplexReturnType MyMethod(){
// Regional code. Only my commpany will use this.
}
}
看到问题?
答案 3 :(得分:1)
您需要使用编译标记来避免 例如:
public partial class MyClass
{
#if National
public static void NationalMethod()
{
}
#endif
}
public partial class MyClass
{
#if Regional
public static void NationalMethod()
{
}
#endif
}
在项目属性中,Build->条件编译符号:根据需求区域添加区域或国家。