इसी कारण से मैंने अपना स्वयं का आईओसी कंटेनर बनाया है जो (सी #/एनईटी में) डिस्पोजेबल सर्विस रैपर लौटाता है, जब निपटान किया जाता है, तो सेवा के संबंध में "सही काम करेगा"।
यह रहें:
- कुछ भी नहीं है, जब कार्य करें:
- वस्तु को लागू नहीं करता है IDisposable
- कंटेनर-दायरे वाले (इस स्थिति में कंटेनर यह और बदले का ट्रैक रखेगा नहीं है एक ही वस्तु एक से अधिक बार, और जब कंटेनर का निपटारा किया जाता है, तो वस्तु भी होगी)
- यह
- पूल नहीं है यह सिंगलटन नहीं है -scoped (एक ही कंटेनर-दायरे वाले, लेकिन कंटेनर के एक पदानुक्रम के सर्वोच्च कंटेनर में सिंगलटन-दायरे वाले सेवा की दुकान के रूप में)
- सेवा के निपटान (यह कारखाना गुंजाइश है, और लागू करता है IDisposable)
- वापसी यह पूल के लिए
इसका मतलब यह है कि सभी कोड मेरी सेवाओं का उपयोग करता है एक का उपयोग कर-ब्लॉक के अंदर है, लेकिन इरादे कम से कम मेरे लिए और अधिक स्पष्ट है,:
using (var service = container.Resolve<ISomeService>())
{
service.Instance.SomeMethod();
}
मूल रूप से यह सा ys: सेवा को हल करें, सेवा उदाहरण पर SomeMethod को कॉल करें, और उसके बाद सेवा का निपटान करें।
सेवा के उदाहरण का निपटान करना है या नहीं, उपभोक्ता के लिए उपलब्ध नहीं है, इसलिए या तो आईडीस्पोजेबल कार्यान्वयन को पूरी तरह से अनदेखा करने या आईडीएसओएसपीबल लागू करने वाली सभी सेवाओं का निपटान करने का विकल्प था। न तो मेरे लिए एक अच्छा समाधान था।तीसरा विकल्प सेवा उदाहरण को किसी ऑब्जेक्ट में लपेटना था जो जानता था कि रैपर का निपटान करने के बाद सेवा के साथ क्या करना है।
स्रोत
2009-10-10 16:25:51
यह भी देखें http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc और http://unity.codeplex.com/Thread/View.aspx?ThreadId=38588 – TrueWill