2010-02-11 18 views
6

Tôi đang sử dụng Unity và Unity.AutoRegistration. Dòng này cho Unity:Sử dụng Unity, Làm cách nào để tự động chuyển một lớp chung với giao diện chung mà không cần đăng ký loại MỌI cho nó

unityContainer.RegisterType(typeof(IAction<>), typeof(Action<>)); 

hiệu quả đăng ký mỗi lớp trong dự án để IAction/Hành động:

unityContainer.RegisterType<IAction<ObjectA>, Action<ObjectA>>(); 
unityContainer.RegisterType<IAction<ObjectB>, Action<ObjectB>>(); 
unityContainer.RegisterType<IAction<ObjectC>, Action<ObjectC>>(); 
[...] 
unityContainer.RegisterType<IAction<UnrelatedObject>, Action<UnrelatedObject>>(); 
[...] 

Nhưng, tôi chỉ muốn đối tượng cụ thể được đăng ký. Tôi sẽ làm như thế nào? Tôi đoán là thêm một trang trí thuộc tính tùy chỉnh cho các lớp cụ thể.

[ActionAtribute] 
public class ObjectB 
{ [...] } 

Và cố gắng sử dụng Unity.AutoRegistration. Đây là nơi tôi bị kẹt tại:

unityContainer.ConfigureAutoRegistration() 
    .Include(If.DecoratedWith<ActionAtribute>, 
      Then.Register() 
      .As ?? // I'm guessing this is where I specify 
      .With ?? // IAction<match> goes to Action<match> 
      ) 
    .ApplyAutoRegistration(); 

Trả lời

6

Phương thức bao gồm quá tải cho phép bạn vượt qua lambda để đăng ký loại của bạn. Để đạt được chính xác những gì bạn muốn với các thuộc tính bạn có thể làm như thế này:

 unityContainer.ConfigureAutoRegistration() 
      .Include(If.DecoratedWith<ActionAtribute>, 
        (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t))) 
      .IncludeAllLoadedAssemblies() 
      .ApplyAutoRegistration(); 

Ngoài ra, số đầu tiên của Bao gồm phương pháp là Predicate, vì vậy nếu bạn không muốn sử dụng các thuộc tính nhưng một số cơ chế khác để xác định những loại để bao gồm hoặc loại trừ, bạn có thể làm như sau:

 // You may be getting these types from your config or from somewhere else 
     var allowedActions = new[] {typeof(ObjectB)}; 
     unityContainer.ConfigureAutoRegistration() 
      .Include(t => allowedActions.Contains(t), 
        (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t))) 
      .IncludeAllLoadedAssemblies() 
      .ApplyAutoRegistration(); 
+0

Đó chính xác là những gì tôi cần! Cảm ơn bạn cho ví dụ. – Jaguir

+0

Tôi không cho rằng có một cách để thực hiện điều này trong cấu hình bằng Unity 2.0? –

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