2012-09-17 47 views
0

我已经编写了以下代码以包含N1和N2 wcf服务引用。我试图编写某种工厂方法来获取代理对象的特定实例,并在运行时决定。从工厂获取不同的返回类型对象

我无法在工厂代码中使用proxyType指定的工厂代码,如下所示。你能否建议我缺少什么信息?

如何用泛型实现这一点,如果我目前的方法不正确?或者是否有针对这种情况的已建立的设计模式?

namespace N1 
{ 
    public class Proxy1 
    { 
     public void foo() 
     { 
      //do something 
     } 
    } 
} 

namespace N2 
{ 
    public class Proxy2 
    { 
     public void foo() 
     { 
      //do something 
     } 
    } 
} 

namespace N3 
{ 
    static class Helper 
    { 
     public static object getProxyInstance(int i, out Type t) 
     { 
      object objectToReturn = null; 
      t = null; 
      if (i == 1) 
      { 
       objectToReturn = new N1.Proxy1(); 
       t = typeof(N1.Proxy1); 
      } 
      else if (i == 2) 
      { 
       objectToReturn = new N2.Proxy2(); 
       t = typeof(N2.Proxy2); 
      } 
      return objectToReturn; 
     } 
    } 
} 

namespace N4 
{ 
    class BusinessClass 
    { 
     public void bar() 
     { 
      Type proxyType; 
      var proxyObj = (proxyType)N3.Helper.getProxyInstance(1, out proxyType); 
     } 
    } 
} 

var proxyObj = (**proxyType**)N3.Helper.getProxyInstance(1, out proxyType); 

Type or namespace proxyType could not be found. 

编辑:这里的挑战是 - PROXY1 & Proxy2将是由Visual Studio添加服务引用命令生成的类。如果我更新服务引用,我的代码更改将消失,每次我都需要重新编写代码。因此,尝试手动编写代码而不包装这些代理类。

+0

为什么你不会只有一个IProxy接口,它们都实现了。 – SimpleVar

+0

@YoryeNathan由于Proxy1和Proxy2是通过添加服务引用生成的类。如果我使用Visual Studio更新服务引用,那么我的代码更改将消失,并且每次我都必须重新编写代码。 – Abhijeet

+1

Visual Studio生成的类通常是部分的。因此,您可能可以通过创建两个新文件来使两个类都实现一个接口,每个文件也都声明所讨论的类为partial,并将它们声明为接口的实现者。我想这很可能是VS生成部分类的原因。 – tomfanning

回答

2
public interface IProxy 
{ 
    void Foo(); 
} 

public class Proxy1 : IProxy 
{ 
    public void Foo() 
    { 
    } 
} 

public class Proxy2 : IProxy 
{ 
    public void Foo() 
    { 
    } 
} 

static class Helper 
{ 
    public static IProxy GetProxyInstance(int i) 
    { 
     if (i == 1) 
     { 
      return new Proxy1(); 
     } 
     else if (i == 2) 
     { 
      return new Proxy1(); 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

class BusinessClass 
{ 
    public void bar() 
    { 
     IProxy proxyObj = Helper.GetProxyInstance(1); 
     proxyObj.Foo(); 
    } 
}