是否可以为通用服务创建WCF服务主机?

时间:2011-10-20 10:28:15

标签: .net wcf

我想提供如下服务:

[ServiceContract]
interface IMyService<T>
{
   [ServiceOperation]
   void Foo(T item);
}

我可以在运行时发现我的通用合约的所有参数的类型(使用一些属性装饰)并使用类似的东西:

typeof(IMyService<>).MakeGenericType(typeof(Contact))

我可以为合同和服务实现获得有界泛型类型。从运行时的基本配置开始,我还可以将端点添加到主机。更了解我感兴趣的所有数据合约,我可以为主机添加每个数据的DataContractResolver

挑战是托管服务。在编译时我不知道类型参数,但我可以在运行时找到它。如何扩展ServiceHost或ServiceHostBase以在其中注入服务类型:

MyService<Contact> 

何时需要? ServiceHost无论如何只需要在运行时...

2 个答案:

答案 0 :(得分:0)

你能否使用ServiceHostFactory?

答案 1 :(得分:-1)

我知道这篇文章很老但是对其他人来说: http://www.codeproject.com/Articles/290148/Pattern-for-Creating-Generic-WCF-Services

修改 链接中的一些代码语义:

[ServiceContract]
interface IBaseService<T> where T : class, INumber
{ 
    [OperationContract]
    string GetData(int value); 
}

public class BaseService<T> : IBaseService<T>
    where T : class, INumber
{
    private T _num;

    public BaseService(INumberFactory<t> numberFactory)
    {
         _num = numberFactory.Create();
    }

    public string GetData(int value)
    {
        var ret = value * _num.Get();

        return ret.ToString();
    }
}

public class NumberOne : INumber
{
    public int Get()
    {
        return 1;
    }
}

public class NumberTwo : INumber
{
    public int Get()
    {
        return 2;
    }
}

public interface INumber
{
    int Get();
}



    public class myServiceHostFactory<TService> : System.ServiceModel.Activation.ServiceHostFactory where TService : class
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            ServiceHost host = new ServiceHost(serviceType, baseAddresses);

            host.AddServiceEndpoint(typeof(TService), new NetTcpBinding(), "");
            return host;
        }


    }