Trả lời

14

Như đã nêu here, API web sử dụng trình phân giải phụ thuộc.

class StructureMapDependencyResolver : IDependencyResolver 
{ 
    public IDependencyScope BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     return ObjectFactory.GetInstance(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return ObjectFactory.GetInstances(serviceType); 
    } 

    public void Dispose() 
    { 
    } 
} 

Và trong Global.asax.cs của bạn, bao gồm dòng này để đăng ký resolver phụ thuộc:

GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(); 

Bên cạnh đó, API Web mới là rất dễ dàng để sử dụng với container IoC.

Tôi chưa xem xét, nhưng tôi tin rằng phương pháp BeginScope mà tôi để trống có thể được sử dụng với các vùng chứa con.

Edit:

Việc thực hiện trên các công trình lớn; trong thực tế, tôi thích nó hơn thay thế tôi sắp nói với bạn. Điều này sẽ giải quyết bất kỳ loại nào với khả năng tốt nhất của StructureMap và sẽ ném lỗi bất cứ khi nào xảy ra sự cố. Tôi thích nhìn thấy lỗi bởi vì họ chỉ cho tôi những gì tôi đã làm sai.

Tuy nhiên, API hy vọng rằng GetService sẽ trả về giá trị rỗng nếu có sự cố. Vì vậy, để đảm bảo phù hợp với các API, đây là việc thực hiện đề nghị:

public object GetService(Type serviceType) 
{ 
    if (serviceType.IsAbstract || serviceType.IsInterface) 
     return ObjectFactory.TryGetInstance(serviceType); 
    else 
     return ObjectFactory.GetInstance(serviceType); 
} 

Sự khác biệt là TryGetInstance chỉ tìm kiếm các loại được đăng ký trong container và sẽ trả về null nếu họ gặp khó khăn. serviceType.IsAbstract || serviceType.IsInterface được coi là đủ tốt của một kiểm tra để quyết định phương pháp để sử dụng. Câu trả lời ban đầu của tôi đã được dự định đơn giản và đơn giản, nhưng @PHeiberg chỉ ra trong các ý kiến ​​ở đây rằng nó không hoàn toàn "đúng". Bây giờ bạn có kiến ​​thức, sử dụng bất cứ điều gì có vẻ tốt nhất.

+0

StructureMap không xử lý phụ thuộc độ phân giải như dự kiến ​​ở đây. Hãy xem ví dụ này và các bình luận của Jeremy: http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg

+0

Thực ra điều này sẽ hiệu quả. Jeremy nói 'TryGetInstance' chỉ giải quyết nếu' serviceType' được đăng ký một cách rõ ràng. 'GetInstance' vẫn sẽ giải quyết các loại không được đăng ký nhưng là cụ thể. – kelloti

+0

Độ phân giải của các phiên bản sẽ hoạt động với mã của bạn. Tuy nhiên tôi giải thích liên kết tôi đã đăng là "Thực tiễn tốt nhất" được đề xuất, kể từ khi Jeremy tự đề xuất [http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3-please-read-this /). Tôi đoán rằng phương pháp GetService là nghĩa vụ phải trả về null, thay vì tạo ra một ngoại lệ nếu loại không thể phân giải bằng container. – PHeiberg

8

Phiên bản phát hành API Web ASP.NET sử dụng trình phân giải phụ thuộc (triển khai giao diện IDependencyResolver) và cũng giới thiệu phạm vi khái niệm - phụ thuộc mới (triển khai giao diện IDependencyScope). Điều quan trọng là phải triển khai IDependencyScope đúng cách - nếu được triển khai đúng cách, nó cho phép phát hành tài nguyên (được tạo ra trong phạm vi) khi IDependencyScope được xử lý. Và nó được xử lý khi yêu cầu kết thúc.

IDependencyScope hoạt động tốt nhất khi vùng chứa hỗ trợ vùng chứa lồng nhau (hoặc con). StructureMap hiện nó từ phiên bản 2.6.1.

tôi đã viết một bài báo như thế nào để cấu hình StructureMap trong Web API: Configuring StructureMap in ASP.NET WebAPI

Bạn cũng có thể kiểm tra bài viết từ Mike Wasson: Using the Web API Dependency Resolver

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