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:
- Aradığım şeyi daha olduğunu ve benim ihtiyaçları için aşırı karmaşık görünüyor WCF Dependency Injection Behavior.
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ş:
Nasıl doğru ActionScript 3 SOAP web se...
Nasıl referans bir değişken geçtim mi?...
Nasıl Java başka bir kurucu arayayım m...
Bir Harita nasıl sıralama<Key, Valu...
Nasıl komisyon bir görev için komut sa...