2013-06-04 29 views
15

tôi muốn làm một quyết đơn giản của nhiều đăng ký kiểu (cuối cùng constructor tiêm, nhưng sử dụng .Resolve để xem nếu Unity thậm chí còn có khả năng điều đó.Bắt thống nhất để giải quyết nhiều trường hợp của cùng loại

Trong mọi trường hợp dưới đây, Unity giải quyết 0 mục nơi cần được giải quyết 2.

có một số chuyển đổi trong sự hiệp nhất mà bật hành vi sau 2007 Hay tôi chỉ quyết liệt thiếu một cái gì đó

đây là mã của tôi:?

public interface IFoo {} 
public class Foo1 : IFoo{} 
public class Foo2 : IFoo{} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IFoo, Foo1>(); 
     container.RegisterType<IFoo, Foo2>(); 

     // container.Resolve<IEnumerable<IFoo>>(); returns 0 
     // container.ResolveAll<IFoo>(); returns 0 

     var foos = container.Resolve<IFoo[]>(); 
     Console.WriteLine(foos.Count()); 

     Console.ReadLine(); 

    } 
} 
+0

Điều này đang sử dụng gói Unity mới nhất trên Nuget tính đến hôm nay. –

Trả lời

31

Trong Unity, chỉ có thể có một đăng ký mặc định (Đăng ký không có tên như trong container.RegisterType<IFoo, Foo1>(); ). Nếu nhiều đăng ký mặc định được thực hiện, lần đăng ký cuối cùng sẽ thắng.

Để đăng ký nhiều thực hiện cho cùng một giao diện, bạn cần phải gán tên cho những đăng ký:

container.RegisterType<IFoo, Foo1>("registration1"); 
container.RegisterType<IFoo, Foo2>("registration2"); 

Ngoài ra, Unity chỉ hiểu mảng theo mặc định. Nếu bạn muốn giải quyết như một mảng thì bạn sẽ ổn với hành vi mặc định. Nếu không, bạn sẽ cần đăng ký ánh xạ giữa mảng và bộ sưu tập bạn quan tâm, như:

container.RegisterType<IEnumerable<IFoo>, IFoo[]>(); 

Lưu ý quan trọng khác là đăng ký mặc định sẽ không được trả lại khi giải quyết bộ sưu tập. Ví dụ đưa ra:

container.RegisterType<IFoo, Foo1>(); 
container.RegisterType<IFoo, Foo2>("registration1"); 
container.RegisterType<IFoo, Foo3>("registration2"); 
container.RegisterType<IEnumerable<IFoo>, IFoo[]>(); 

Nếu bạn giải quyết IEnumerable<IFoo>, kết quả sẽ chỉ chứa các trường hợp Foo2Foo3, nhưng sẽ không có một thể hiện của Foo1 vì việc đăng ký mặc định không được bao gồm.

+0

cảm ơn sự rõ ràng! Điều đó rất hữu ích. –

+0

@ S.Hebert rất vui được trợ giúp! Đó là một phần của Unity khá khó hiểu là công bằng ... –

+0

Trong một ứng dụng MVC, có ok không khi nào 'var container = new UnityContainer();' và 'container.Resolve()' ở bất cứ đâu tôi muốn? Hoặc có cách nào tốt hơn để làm điều đó? – Narayana