2014-06-20 4 views
10

मेरे पास एक सजावट है जिसमें कुछ अन्य निर्भरताएं हैं जिन्हें कंटेनर का उपयोग करके हल किया जाना चाहिए। उदाहरण:सभी निर्भरताओं को मैन्युअल रूप से निर्दिष्ट किए बिना ऑटोफैक में एक सजावटी को पंजीकृत करें

public class FooDecorator : IFoo 
{ 
    public FooDecorator(IFoo inner, IBar bar, IBaz baz) 
} 

मैं इस तरह इस रजिस्टर कर सकते हैं:

builder.RegisterType<Foo>().As<IFoo>(); 
builder.RegisterDecorator<IFoo>((c, inner) => 
    new FooDecorator(inner, c.Resolve<IBar>(), c.Resolve<IBaz>()), "key"); 

यह काम कर रहा है, फिर भी है कि अच्छा नहीं मैं मैन्युअल रूप से अन्य सभी निर्भरता निर्दिष्ट करने के लिए है। मुझे क्या करना चाहते हैं:

builder.RegisterDecorator<FooDecorator, IFoo>("key"); 

कहाँ IFoo 'आंतरिक' IFoo और अन्य निर्भरता कंटेनर से हल कर रहे हैं करने के लिए हल हो गई है। यह संभव है, या मैं एक समारोह है कि इस व्यवहार का परिणाम देगा के साथ एक डेकोरेटर रजिस्टर कर सकते हैं?

उत्तर

8

आदेश मैन्युअल रूप से सभी निर्भरता को निर्दिष्ट बचने के लिए, आप Autofac में डेकोरेटर रजिस्टर और RegisterDecorator विधि के पहले पैरामीटर के अंदर इसे हल करना चाहिए।

builder.RegisterType<Foo>() 
     .Named<IFoo>("original"); 
builder.RegisterType<FooDecorator>() 
     .Named<IFoo>("decorator"); 
builder.RegisterDecorator<IFoo>((c, inner) => c.ResolveNamed<IFoo>("decorator", TypedParameter.From(inner)), "original") 
     .As<IFoo>(); 

नामित पंजीकरण का उपयोग कर सजावटी को पंजीकृत करना किसी भी संघर्ष से बच जाएगा।

+0

यह बहुत ही बढ़िया है, लेकिन अगर आपको पता नहीं है (या देखभाल) कि 'IFoo' का विशिष्ट कार्यान्वयन' Foo' है? यह "सजाने जो वर्तमान में' FooDecorator' साथ 'IFoo' को हल करने है" की तर्ज पर कुछ घोषणा करने के लिए संभव है? (यह मानते हुए कि IFoo पहले 'IFoo' प्रदान करने के लिए पंजीकृत किया गया, लेकिन जरूरी नहीं कि एक _named_ सेवा के रूप में) - पी एस मुझे लगता है कि यह है कि क्या ओ पी, के लिए देख रहा था भी –

+0

@CristiDiaconescu वहाँ यह करने के लिए कोई आसान समाधान है और करने के लिए एक नामित निर्दिष्ट किए बिना पहले डेकोरेटर आप Autofac कंटेनर में 2 पंजीकरण करना होगा। यदि आप कैसे प्राप्त करने के लिए आप चाहते हैं क्या पर अधिक विस्तार चाहते हैं एक नया सवाल पूछने के लिए स्वतंत्र महसूस करें। –

1

सिरिल डूरंड के जवाब के आधार पर, यहाँ एक डेकोरेटर रजिस्टर करने के लिए एक सामान्य सहायक विधि है:

private void RegisterDecorator<TInterface, TImplementation, TDecorator>(ContainerBuilder builder) where TImplementation : TInterface where TDecorator : TInterface 
    { 
     builder.RegisterType<TImplementation>().Named<TInterface>("implementation"); 
     builder.RegisterType<TDecorator>().Named<TInterface>("decorator"); 
     builder.RegisterDecorator<TInterface>((c, inner) => c.ResolveNamed<TInterface>("decorator", TypedParameter.From(inner)), "implementation"); 
    } 

एक से अधिक नेस्टेड सज्जाकार के लिए आवश्यक हैं, तो अधिक सामान्य मानकों (TDecorator1, TDecorator2 आदि) के साथ एक समान विधि पेश किया जा सकता।

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

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