SORU
16 Mart 2010, Salı


Nasıl XML servisinden kurucu değerleri geçtim mi?

Benim hizmet uygulayan sınıf kurucu değerleri geçmek istiyorum.

Ancak ServiceHost onun contrstructor geçmek için değil, sadece beni oluşturmak için türünün adı geçmesini sağlar.

Servis benim nesne oluşturur fabrika geçmek mümkün olmak istiyorum.

Ne ben şimdiye kadar bulduk:

CEVAP
16 Mart 2010, Salı


Özel ServiceHostFactory, ServiceHost IInstanceProvider Bir Arada uygulanması gerekir.

Bu oluşturucu imza: bir hizmet vermiş

public MyService(IDependency dep)

İşte Başlatılıyor hazırlansın bir örnek:

public class MyServiceHostFactory : ServiceHostFactory
{
    private readonly IDependency dep;

    public MyServiceHostFactory()
    {
        this.dep = new MyClass();
    }

    protected override ServiceHost CreateServiceHost(Type serviceType,
        Uri[] baseAddresses)
    {
        return new MyServiceHost(this.dep, serviceType, baseAddresses);
    }
}

public class MyServiceHost : ServiceHost
{
    public MyServiceHost(IDependency dep, Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
    {
        if (dep == null)
        {
            throw new ArgumentNullException("dep");
        }

        foreach (var cd in this.ImplementedContracts.Values)
        {
            cd.Behaviors.Add(new MyInstanceProvider(dep));
        }
    }
}

public class MyInstanceProvider : IInstanceProvider, IContractBehavior
{
    private readonly IDependency dep;

    public MyInstanceProvider(IDependency dep)
    {
        if (dep == null)
        {
            throw new ArgumentNullException("dep");
        }

        this.dep = dep;
    }

    #region IInstanceProvider Members

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return this.GetInstance(instanceContext);
    }

    public object GetInstance(InstanceContext instanceContext)
    {
        return new MyService(this.dep);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
        var disposable = instance as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }

    #endregion

    #region IContractBehavior Members

    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
    }

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
    {
        dispatchRuntime.InstanceProvider = this;
    }

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
    {
    }

    #endregion
}

Senin Başlatılıyor içinde MyServiceHostFactory kayıt.svc dosyası, ya da doğrudan kendi barındırma senaryoları için kodu kullanın.

Kolayca bu yaklaşım, genelleme ve hatta bazı Dİ Kaplar zaten sizin için bu (ipucu: Windsor Tesisi XML) yapmış.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bmarian22

    bmarian22

    22 Aralık 2007
  • boburnham

    boburnham

    11 Temmuz 2006
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012