【问题标题】:Is it possible to make a WCF service host for a generic service?是否可以为通用服务创建 WCF 服务主机?
【发布时间】:2011-12-12 01:51:51
【问题描述】:

我想提供如下服务:

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

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

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

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

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

MyService<Contact> 

什么时候需要?无论如何,ServiceHost 只会在运行时需要它...

【问题讨论】:

  • 您是根据可能的通用合同类型(而不是 1 个端点)创建一个端点,您是自托管还是托管在 IIS 中?
  • 可能duplicate.
  • 是的,我正在为每个可能的通用合约(Juval Lowy 称之为有界通用)创建一个端点。问题不在于制作端点,而是创建必须具有一种实现服务类型的主机。我可以为每个可能的服务实现创建一个 ServiceHost。我不确定这将如何工作...我想在 WAS 中托管。

标签: .net wcf


【解决方案1】:

你不能使用 ServiceHostFactory 吗?

【讨论】:

  • 感谢您的回答。然而,这不是我要找的......事实上,如果我能以某种方式制作一个托管通用服务的 ServiceHost,我将使用 ServiceHostFactory 让 WAS 使用我自己的 ServiceHost。
【解决方案2】:

我知道这篇文章很旧,但对其他人来说: 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;
        }


    }

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 同意,我从链接中编辑并添加了代码语义。在我有机会听取建议之前,请不要对帖子进行 -1。
  • 我不是反对者。很多人会查看答案,所以肯定有人对您的答案投了反对票。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2021-12-02
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多