2009-05-18 6 views
13

Làm cách nào để làm cho Unity không được ném ResolutionFailedException nếu Resolve không thành công?Có TryResolve trong Unity không?

Có điều gì đó như TryResolve<IMyInterface> không?

var container = new UnityContainer(); 
var foo = container.TryResolve<IFoo>(); 
Assert.IsNull(foo); 

Trả lời

8

Đây là một vấn đề trên trang web CodePlex, bạn có thể tìm mã ở đây (xem ở dưới cùng của chủ đề đó và họ đã thực hiện một phương pháp mở rộng ... rất tiện dụng)

http://unity.codeplex.com/Thread/View.aspx?ThreadId=24543

và bạn có thể sử dụng mã như thế này:

if (container.CanResolve<T>() == true) 
{ 
    try 
    { 
     return container.Resolve<T>(); 
    } 
    catch (Exception e) 
    { 
     // do something else 
    } 
} 

CanResolve là phương pháp khuyến nông. Tôi thực sự đăng ký đó mở rộng khi tạo của container ... một cái gì đó như thế này:

private void CreateContainer() 
{ 
    ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 

    map.ExeConfigFilename = // path to config file 

    // get section from config code goes here 

    IUnityContainer container = new UnityContainer(); 
    container.AddNewExtension<UnityExtensionWithTypeTracking>(); 
    section.Containers.Default.Configure(container);   
} 
3

Có vẻ như thiếu tính năng này. This article cho thấy ví dụ về phương pháp đóng gói Resolve trong khối try/catch để thực hiện nó.

public object TryResolve(Type type) 
{ 
    object resolved; 

    try 
    { 
     resolved = Resolve(type); 
    } 
    catch 
    { 
     resolved = null; 
    } 

    return resolved; 
} 
+0

Cảm ơn câu trả lời tuyệt vời. Tôi đã không chắc chắn nếu câu hỏi của tôi là rõ ràng, nhưng câu trả lời của bạn là chính xác những gì tôi đang tìm kiếm. – Vadim

1

Điều này không có sẵn trong bản phát hành hiện tại. Tuy nhiên, bạn luôn có thể "cuộn của riêng bạn" bằng cách sử dụng các phương pháp mở rộng trong C# 3. Khi Unity hỗ trợ điều này, bạn có thể bỏ qua hoặc cập nhật phương thức mở rộng.

public static class UnityExtensions 
{ 
    public static T TryResolve<T>(this UnityContainer container) 
     where T : class 
    { 
     try 
     { 
      return (T)container.Resolve(typeof(T)); 
     } 
     catch(Exception) 
     { 
      return null; 
     } 
    } 
} 
+6

Chức năng nhưng đắt tiền. Bắt ngoại lệ và trả về null không phải là một thực hành tốt. –

14

Cũng lưu ý rằng, nếu bạn đang sử dụng Unity 2.0 bạn có thể sử dụng phương pháp mới IsRegistered() và nó generic version là tốt.

+8

Một [cảnh báo lớn] (https://unity.codeplex.com/discussions/392550) về phương pháp IsRegistered: Nó chỉ có nghĩa là để gỡ lỗi vì nó nổi tiếng là chậm! Nó có một đặc tính hiệu suất của O (n) và hoàn toàn có thể làm chết hiệu suất của ứng dụng của bạn. – Steven