2012-01-07 75 views
1

我有一个抽象类,用于在WCF代理中设置缺省值。我希望我的所有其他代理都能从这个类派生出来,并传入在添加服务引用时生成的服务客户端。因此,我有以下将参数传递给在抽象类中创建的新泛型类

public abstract class ProxyFactory<T> where T : new() 
{ 
    protected BasicHttpBinding BasicHttpBinding = new BasicHttpBinding(); 

    public abstract T GetTranslationServiceClient(); 

    protected ProxyFactory() 
    { 
     BasicHttpBinding.Security.Mode = BasicHttpSecurityMode.None; 
    } 

    protected T CreateClientForServiceAtEndpoint(string uri) 
    { 
     var address = new EndpointAddress(uri); 
     return new T(BasicHttpBinding, address); 
    } 
} 

因此,举例来说,如果你有一个项目,并增加了一个服务引用WCF服务名为MyService你会叫MyServiceClient生成的类。然后,我将创建一个名为MyServiceProxy的新类,该类将从此类派生,其中T将是MyServiceClient类型。这将允许我在基础中完成所有常用配置,并且我需要编写的唯一代码是使用服务的url覆盖CreateClientForServiceAtEndpoint

public override MyServiceImplClient GetMyServiceClient() 
{ 
    return CreateClientForServiceAtEndpoint("http://localhost/MyServices/MyServiceImpl.svc"); 
} 

在此派生类将被用作工厂,以便给客户打电话将创建一个新的实例并调用CreateClientForServiceAtEndpoint得到预先配置的WCF代理

的问题是线return new T(BasicHttpBinding, address);中的的CreateClientForServiceAtEndpoint方法抽象类。它不会允许我将参数传递给构造函数。如何才能做到这一点?

+1

它有时可能是一个更好的选择来引入一个初始化方法的接口 – 2012-01-07 10:50:38

回答

3

在这种情况下,你需要用Activator.CreateInstance创建返回的实例:

protected T CreateClientForServiceAtEndpoint(string uri) 
{ 
    var address = new EndpointAddress(uri); 
    return (T) Activator.CreateInstance(typeof(T), BasicHttpBinding, address); 
} 

而且没有必要的where T : new()限制。

编辑:马克的评论后

因为现在为什么要说一个T的构造函数什么(其他然后new())如果提供的T没有正确的构造函数Activator.CreateInstance可以抛出。

但是你可以用 创建一个抽象基类中添加一些额外的指南,您的API用户:

public abstract class ServiceImplClientBase 
{ 
    public ServiceImplClientBase(BasicHttpBinding basicHttpBinding, EndpointAddress endpointAddress) 
    { 
     //... 
    } 
} 

而且使用它作为类型限制:where T : ServiceImplClientBase。但它只能提供构造函数的提示,因为派生类型可以将基类构造函数声明为private或protected。

+0

优秀的答案谢谢你 – John 2012-01-07 10:51:49

+0

第二个例子不起作用 - 那没有说T的构造函数 – 2012-01-07 10:58:47

相关问题