2014-12-16 10 views
12

मैं दो इंटरफेस है:पंजीयन 'आधा बंद किए गए' वंशावली घटक

public interface IQuery<TResult> { } 

public interface IQueryHandler<in TQuery, out TResult> 
    where TQuery : IQuery<TResult> 
{ 
    TResult Handle(TQuery q); 
} 

IQueryHandler की एक बंद कार्यान्वयन का एक उदाहरण:

public class EventBookingsHandler : IQueryHandler<EventBookings, IEnumerable<EventBooking>> 
{ 
    private readonly DbContext _context; 

    public EventBookingsHandler(DbContext context) 
    { 
     _context = context; 
    } 

    public IEnumerable<EventBooking> Handle(EventBookings q) 
    { 
     return _context.Set<MemberEvent>() 
      .OfEvent(q.EventId) 
      .AsEnumerable() 
      .Select(EventBooking.FromMemberEvent); 
    } 
} 

मैं रजिस्टर और साथ IQueryHandler<,> के बंद सामान्य कार्यान्वयन हल कर सकते हैं यह घटक पंजीकरण:

Classes.FromAssemblyContaining(typeof(IQueryHandler<,>)) 
    .BasedOn(typeof(IQueryHandler<,>)) 
    .WithServiceAllInterfaces() 

हालांकि मैं क्या करना चाहता हूं

public class GetById<TEntity> : IQuery<TEntity> where TEntity : class, IIdentity 
{ 
    public int Id { get; private set; } 

    public GetById(int id) 
    { 
     Id = id; 
    } 
} 

public class GetByIdHandler<TEntity> : IQueryHandler<GetById<TEntity>, TEntity> where TEntity : class, IIdentity 
{ 
    private readonly DbContext _context; 

    public GetByIdHandler(DbContext context) 
    { 
     _context = context; 
    } 

    public TEntity Handle(GetById<TEntity> q) 
    { 
     return _context.Set<TEntity>().Find(q.Id); 
    } 
} 

जब मैं IQueryHandler<GetById<Event>, Event> को हल करने की कोशिश की है कि मैं इस अपवाद मिल गया:

प्रकार का एक अपवाद एक खुला सामान्य कार्यान्वयन जाता है कि "आधा बंद कर दिया" (यानी एक सामान्य TQuery प्रकार पैरामीटर निर्दिष्ट करता है) को हल है 'Castle.MicroKernel.Handlers.GenericHandlerTypeMismatchException' Castle.Windsor.dll में हुआ था लेकिन उपयोगकर्ता कोड

अतिरिक्त जानकारी: प्रकार Queries.GetById'1 [[मॉडल। इवेंट, डोमेन, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyTok en = null]], मॉडल। इवेंट कार्यान्वयन प्रकार की सामान्य बाधाओं को पूरा नहीं करते हैं Query.GetByIdHandler'1 घटक 'Queries.GetByIdHandler'1'। यह आपके कोड में एक बग की संभावना है।

ऐसा लगता है कि प्रकार सफलतापूर्वक पंजीकृत किया गया है, और बाधाओं जहाँ तक मैं बता सकता हूँ संतुष्ट हैं (Event एक वर्ग है और IIdentity लागू करता है)। मुझे यहां क्या समझ नहीं आ रहा है? क्या मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो विंडसर का सामना नहीं कर सकता?

उत्तर

5

(मैं इस एक जवाब के रूप बस कुछ उपयोगी जानकारी है कि एक टिप्पणी के लिए बहुत अधिक जानकारी के रूप में पोस्ट कर रहा हूँ नहीं,।)

जबकि कैसल में इस कोड में विफल रहता है:

public void Resolve_GetByIdHandler_Succeeds() 
{ 
    var container = new Castle.Windsor.WindsorContainer(); 

    container.Register(Component 
     .For(typeof(IQueryHandler<,>)) 
     .ImplementedBy(typeof(GetByIdHandler<>))); 

    var x = container.Resolve<IQueryHandler<GetById<Event>, Event>>(); 
} 

Simple Injector कार्यों में एक ही बात:

public void GetInstance_GetByIdHandler_Succeeds() 
{ 
    var container = new SimpleInjector.Container(); 

    container.RegisterOpenGeneric(
     typeof(IQueryHandler<,>), 
     typeof(GetByIdHandler<>)); 

    var x = container.GetInstance<IQueryHandler<GetById<Event>, Event>>(); 
} 
+0

धन्यवाद, ऐसा लगता है कि इस विंडसर के साथ कोई समस्या – AlexFoxGill

+1

मैं आगे की जांच की है है तो और मुझे लगता है कि आप कर रहे हैं ठीक है तो यह सही answe है आर: विंडसर ऐसा नहीं कर सकता है। सरल इंजेक्टर मेरी परियोजना के लिए बेहतर और बेहतर दिख रहा है – AlexFoxGill

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