2013-01-03 31 views
5

Tôi mới đến khái niệm DI và mới về structuremap. Tôi đang cố gắng điền đầy đủ một kịch bản mà tất cả các giao diện của tôi nằm trong AssemblyA và tất cả các triển khai của tôi đều nằm trong AssemblyB. Tôi muốn sử dụng StructureMap để tiêm dụ của AssemblyB lớp trong constructor trong đó có sự phụ thuộc vào giao diện từ AssemblyASự phụ thuộc tiêm từ nhiều hội đồng sử dụng Structuremap

public class Customer(ICustomerService) 
{ 

} 

ICustomerService là trong AssemblyACustomerService lớp là trong assemblyB. Tôi muốn Structuremap để tiêm CustomerService dụ trong constructor này. Tôi giả định rằng nếu tên của lớp giống với tên của giao diện được đặt trước và I. Structuremap sẽ tự động nhận ra nó.

Tôi đã viết cấu hình sau.

x => 
     { 


      x.Scan(scan => 
       { 
        scan.Assembly("AssemblyA"); 
        scan.Assembly("AssemblyB"); 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
      }); 

nhưng nó mang lại cho tôi lỗi

StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily AssemblyA.ICustomerService, AssemblyA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

Bất kỳ trợ giúp sẽ được hữu ích. Tôi muốn sử dụng các quy ước mặc định và tránh đăng ký từng giao diện cho một lớp.

Cảm ơn.

Trả lời

1

Ok, tôi đã làm việc đó nhưng tôi thậm chí còn bối rối hơn bây giờ.

Mã này dường như làm việc

IContainer container = new Container(c => 
      { 
       c.Scan(x => 
       { 
        x.Assembly("AssemblyA"); 
        x.Assembly("AssemblyB"); 
        x.IncludeNamespace("AssemblyA"); 
        x.TheCallingAssembly(); 
        x.WithDefaultConventions(); 
       }); 
      }); 

Ở đây tôi có đơn giản x.IncludeNamespace gia tăng ("AssemblyA"); sau khi AssemblyB quét suy nghĩ rằng nó cần không gian tên này và nó đã bắt đầu làm việc.

Vấn đề của tôi được giải quyết nhưng tôi không biết điều gì là sai hoặc nếu đây là cách phù hợp để đi. Mọi trợ giúp sẽ vẫn được đánh giá cao.

+0

Ok, tôi đã có thể hiểu điều gì đang xảy ra. Tôi có nhiều lớp đang triển khai Giao diện trong các hội đồng khác nhau mà tôi đang quét. Điều này tạo ra lỗi ban đầu mà tôi đã báo cáo trong câu hỏi. Mã mà tôi đăng trong câu hỏi sẽ hoạt động chính xác nếu chỉ có một lớp thỏa mãn Công ước mặc định của SM trong tất cả các hội đồng quét. Tôi xấu vì không nhận được nó trước đó nhưng hy vọng nó sẽ giúp bất cứ ai đập đầu của mình. Ngay sau khi tôi thêm x.IncludeNamespace ("AssemblyA"); dòng về cơ bản tôi lọc lớp lắp ráp cho SM và nó bắt đầu làm việc :) –

Các vấn đề liên quan