2010-01-20 79 views
1

我想在WPF客户端应用程序中集中创建我的WCF代理。在创建每个代理期间,我想定义programaticaly特定的端点行为(添加本地化头文件等)并定义客户端凭证设置(我使用的是具有UserName客户端凭证的消息级别安全性)。代理的创建应该是这样的:WCF客户端代理创建策略与自定义端点行为

public class ServiceChannelFactory 
{ 
public T CreateChannel<T, TService>() where T : ClientBase<TService> 
{ 
    var proxy = new T(bindingBuilder.GetBinding(), endpointBuilder.GetEndpointAddress()); //!!! 
    proxy.Endpoint.Behaviors.Add(new LocalizationEndpointBehavior()); 
    proxy.ClientCredentials.UserName.UserName = applicationContext; 
    proxy.ClientCredentials.UserName.Password = txtPassword.Password; 
    return proxy; 
} 
} 

和使用情况应该是这样的:

var scp = new ServiceChannelFactory(); 
var proxy = scp.CreateChannel<MyServiceClient, ICustomerService>(); 
proxy.Open(); 
try 
{ 
    proxy.CallService(); 
} 
finally 
{ 
    proxy.Close(); 
} 

,但我无法弄清楚如何实际创建代理对象,而无需使用反射(// !!!注释行)。

MyServiceClient类由VS> Add Service Reference生成。

是否存在针对此问题的最佳实践解决方案?

回答

1

如果添加新()约束,则可以创建泛型类型的实例(假设它具有无参数构造函数)。

public class ServiceChannelFactory 
{ 
    public T CreateChannel<T, TService>() 
    where TService : class 
    where T : ClientBase<TService>, new() 
    { 
     var proxy = new T(); 

     //Configure proxy here 

     return proxy; 
    } 
} 
+0

你是对的 - 我认为Endpoint.Binding和Address没有setter,所以我没有意识到它是如此简单:)谢谢 – Buthrakaur 2010-01-21 07:34:10