2012-04-03 11 views
6

के साथ डब्ल्यूसीएफ सेवा में काम की इकाई को कार्यान्वित करना मैं ऑटोफैक के साथ डब्ल्यूसीएफ सेवा में कार्य पैटर्न की इकाई को कैसे कार्यान्वित कर सकता हूं?ऑटोफैक

मेरी सेवाओं और भंडारों में कार्य इंटरफ़ेस की इकाई के प्रति यूनिट (या ऑटोफैक शब्द लाइफटाइमस्कोप में) को इंजेक्शन करना ऑटोफैक के डब्ल्यूसीएफ एकीकरण का उपयोग करना आसान है - जो मैं कर रहा हूं वह काम के बदलावों की इकाई को प्रतिबद्ध करने का एक तरीका है डब्ल्यूसीएफ सेवा कॉल की वापसी स्पष्ट रूप से केवल तभी होती है जब कोई अपवाद नहीं होता है।

मैंने Using a Custom Endpoint Behavior with WCF and Autofac देखा है जो मूल रूप से मैंने कैसे शुरू किया है लेकिन यह अपवादों से निपटता नहीं है।

वर्तमान में मेरे पास IOperationInvoker है जो Invoke में काम की इकाई शुरू करता है और केवल तभी होता है जब कोई अपवाद नहीं होता है। इस दृष्टिकोण के साथ समस्या यह है कि मुझे Invoke विधि के अंदर कार्य उदाहरण की मेरी इकाई को हल करने की आवश्यकता है जो मुझे AutofacInstanceProvider का उपयोग करके मेरी सेवाओं और भंडारों में इंजेक्शन से अलग एक अलग उदाहरण देता है।

+0

मान लीजिए कि हमने कंटेनर में 'IUnitOfWork' पंजीकृत किया है। हम इसके साथ एक सेवा कॉल कैसे लपेट सकते हैं और यदि कोई अपवाद नहीं हुआ है तो केवल 'SaveChanges()' को कॉल करें? या क्या हमें सेवा कन्स्ट्रक्टर में यूओडब्ल्यू लेना है? – jgauffin

+0

जब आप सेवा कॉल कहते हैं, तो क्या आपका मतलब डब्ल्यूसीएफ सेवा कॉल है? यदि हां, तो ऊपर दिए गए लिंक से पता चलता है कि आप यह कैसे कर सकते हैं। ऑटोफैक का उपयोग करते समय कोई अपवाद नहीं होने पर मुझे केवल एक ही समस्या है कि मुझे केवल यूओडब्लू को बचाने का कोई तरीका नहीं मिला है। –

+0

आपने यह स्वयं कहा है =) 'मैं जो भी कर रहा हूं वह डब्ल्यूसीएफ सेवा कॉल की वापसी पर कार्य परिवर्तन की इकाई को प्रतिबद्ध करने का एक तरीका है, जाहिर है कि अगर कोई अपवाद नहीं है।' यह कठिन हिस्सा है और मैं क्या देख रहा हूं। – jgauffin

उत्तर

1

ब्रैडली बोवेनिनिस को इस समस्या का समाधान मिला। हम अच्छी तरह से यह परीक्षण नहीं किया है, लेकिन यह काम करने के लिए लगता है:

public class UnitOfWorkAwareOperationInvoker : IOperationInvoker 
{ 
    private readonly IOperationInvoker _baseInvoker; 

    public UnitOfWorkAwareOperationInvoker(IOperationInvoker baseInvoker) 
    { 
     _baseInvoker = baseInvoker; 
    } 

    public object[] AllocateInputs() 
    { 
     return _baseInvoker.AllocateInputs(); 
    } 

    public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     var result = _baseInvoker.Invoke(instance, inputs, out outputs); 
     var context = OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>(); 

     try 
     { 
      context.Resolve<IUnitOfWork>().Save(); 
     } 
     catch (Exception ex) 
     { 
      var message = Message.CreateMessage(MessageVersion.Default, string.Empty); 
      new ElmahErrorHandler().ProvideFault(ex, null, ref message); 
      throw; 
     } 
     return result; 
    } 

    public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) 
    { 
     return _baseInvoker.InvokeBegin(instance, inputs, callback, state); 
    } 

    public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) 
    { 
     return _baseInvoker.InvokeEnd(instance, out outputs, result); 
    } 

    public bool IsSynchronous 
    { 
     get { return _baseInvoker.IsSynchronous; } 
    } 
} 

कुंजी निम्न पंक्ति में है:

OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>(); 

यह UOW पकड़ लेता है परिवेश/वर्तमान/प्रासंगिक LifetimeScope से बाहर।

+1

क्या ऑपरेशन अपवाद फेंकने पर भी बदलाव नहीं करता है? – jgauffin

+0

@jgauffin ऐसा नहीं होना चाहिए, जैसे सेवा कॉल के भीतर एक अपवाद फेंक दिया गया है, इसे _baseInvoker.Invoke (उदाहरण, इनपुट, आउट आउटपुट) कॉल पर फेंक दिया जाएगा और नीचे दिए गए सभी कोड को अनदेखा कर दिया जाएगा। – xelibrion

संबंधित मुद्दे