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

  • bombjack2991

    bombjack2991

    29 HAZİRAN 2008
  • Capcom Unity

    Capcom Unity

    5 NİSAN 2010
  • chrmoe

    chrmoe

    7 Kasım 2006