2012-03-05 14 views
8

Tôi có một câu hỏi mới khác về việc đăng ký các phụ thuộc bổ sung trong TinyIoc để sử dụng trong NancyFX.Đăng ký các phụ thuộc trong TinyIOC để sử dụng trong NancyFX

tôi tiếp tục để có được những ngoại lệ sau khi chạy ứng dụng ...

Unable to resolve type: AdvancedSearchService.Interfaces.IResponseFactory 

Exception Details: TinyIoC.TinyIoCResolutionException: Unable to resolve type: AdvancedSearchService.Interfaces.IResponseFactory 

Source Error: 
Line 25:    var container = TinyIoCContainer.Current; 
Line 26: 
Line 27:    _responseFactory = container.Resolve<IResponseFactory>(); 
Line 28:   
Line 29: 

Tôi hiện đang đăng ký phụ thuộc của tôi sai, nhưng tôi dường như không thể tìm ra cách chính xác. Dưới đây là mã của tôi trong bootstrapper tùy chỉnh của tôi. Cũng lưu ý rằng tôi hiện không gọi phương thức base.ConfigureRequestContainer vì tôi dường như không thể tìm ra cách để có được bối cảnh hiện tại để truyền vào nó.

protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
{ 
    container.Register<IRavenSessionManager>(new RavenSessionManager()); 
    base.ConfigureApplicationContainer(container); 

    ConfigureRequestContainer(container); 
} 


protected void ConfigureRequestContainer(TinyIoCContainer applicationContainer) 
{ 
    var requestContainer = applicationContainer.GetChildContainer(); 
    requestContainer.Register<ISearchRepository>(new SearchRepository(requestContainer.Resolve<IRavenSessionManager>().GetSession())); 
    requestContainer.Register<IResponseFactory>(new ResponseFactory(requestContainer.Resolve<ISearchRepository>())); 
    //base.ConfigureRequestContainer(requestContainer,[I NEED THE CONTEXT]) 
} 

Bất kỳ trợ giúp sẽ thực sự được đánh giá cao ... rõ ràng là sự thiếu hiểu biết của tôi không có giới hạn :)

+0

Cảm ơn Steven để làm sạch mà up..I thậm chí không nhận thấy rằng các mã đã được tách ra khi tôi đăng nó. – TheWeekendDeveloper

Trả lời

36

Ok, không chắc chắn 100% bắt đầu từ đâu .. bạn không cần bối cảnh vì bạn làm sai :-)

Thứ nhất, tại sao bạn lại gọi "định cấu hình vùng chứa yêu cầu" và tại sao bạn tạo vùng chứa con? Bạn không làm điều đó :-) Có hai phạm vi, phạm vi ứng dụng, được định cấu hình bằng cách ghi đè ConfigureApplicationContainer và phạm vi yêu cầu, được định cấu hình bằng cách ghi đè ConfigureRequestContainer, bạn không tự gọi chúng, bạn chỉ ghi đè tùy thuộc vào cách bạn muốn phạm vi đối tượng của bạn.

Thứ hai, trình khởi động mặc định Nancy sẽ "tự động" mọi thứ có thể trong việc thực thi mặc định của ConfigureApplicationContainer. Bằng cách gọi "cơ sở" sau bạn đã thực hiện đăng ký thủ công, bạn đang sao chép hiệu quả qua đăng ký ban đầu của mình bằng cách tự động đăng ký. Hoặc là không gọi cơ sở hoặc gọi nó trước khi bạn đăng ký thủ công. Và, một lần nữa, đừng gọi ConfigureRequestContainer từ ConfigureApplicationContainer của bạn :-)

Nếu bạn không quan tâm đến mọi thứ đang được ứng dụng (vì vậy các singetons có cùng một trường hợp cho mỗi yêu cầu) thì bạn không cần bất kỳ , bạn chỉ có thể dựa vào autoregister.

Bạn hiện đang xây dựng các đối tượng của mình theo cách thủ công và đưa chúng vào trong vùng chứa, điều đó có vẻ là một cách khá kỳ lạ để thực hiện. Thông thường bạn chỉ cần đăng ký các loại và để cho container xử lý instantiating như và khi nó cần.

Bạn không ghi đè cấu hình ConfigureRequestContainer, bạn chỉ đang tạo một phương thức mới (có chữ ký khác).

Vì vậy, những gì bạn có thể muốn là một cái gì đó như:

protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
{ 
    base.ConfigureApplicationContainer(container); 

    // Autoregister will actually do this for us, so we don't need this line, 
    // but I'll keep it here to demonstrate. By Default anything registered 
    // against an interface will be a singleton instance. 
    container.Register<IRavenSessionManager, RavenSessionManager>(); 
} 

// Need to override this, not just make a new method 
protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context) 
{ 
    // Get our session manager - this will "bubble up" to the parent container 
    // and get our application scope singleton 
    var session = container.Resolve<IRavenSessionManager>().GetSession(); 

    // We can put this in context.items and it will be disposed when the request ends 
    // assuming it implements IDisposable. 
    context.Items["RavenSession"] = session; 

    // Just guessing what this type is called 
    container.Register<IRavenSession>(session); 

    container.Register<ISearchRepository, SearchRepository>(); 
    container.Register<IResponseFactory, ResponseFactory>(); 
} 
+4

Nancy cũng thực hiện độ phân giải tự động của các phụ thuộc hàm dựng trong các mô-đun (và các kiểu khác) để bạn _never_ nên sử dụng _TinyIoCContainer.Current_ và giải quyết trực tiếp từ đó. Đơn giản chỉ cần thêm một phụ thuộc vào constructor của bạn và tắt bạn đi! Cảm ơn – TheCodeJunkie

+0

Tôi phải nói điều này ... cho ai đó có hình đại diện của GrumpyDev, tôi đã mong đợi nhiều hơn nữa :(và không quá nhiều :). Tôi biết mã của tôi đã nhầm lẫn với crap của bạn, vì vậy cảm ơn sự kiên nhẫn của bạn. – TheWeekendDeveloper

+0

Btw: cố định nó như một nét duyên dáng. Bạn đã nhận ra những gì tôi không nhận ra được và đó là chữ ký khác của phương thức ConfigureRequestContainer. Lần đầu tiên tôi cố gắng ghi đè nó giống như bạn có trong giải pháp của bạn, nhưng không nhận ra tôi đã sử dụng chữ ký cũ. Bởi vì Nancy đã không nhận ra chữ ký cũ, tôi đã tạo ra phương pháp riêng của tôi ra khỏi tuyệt vọng :).Kỳ lạ là tôi cuối cùng đã thêm base.ConfigureRequestManager (contianer, context) vào phương thức riêng của tôi, nhưng không thể thực hiện kết nối. Não của tôi đã được chiên bởi thời điểm đó :). – TheWeekendDeveloper