2011-01-23 22 views
6

Ví dụ, tôi đã đăng ký lớp C1 với một tham số trong hàm dựng của loại System.Type. Tôi có một lớp (C2) với tham số tiêm của loại C1. Và tôi muốn tự động nhận được typeof(C2) trong hàm tạo C1. Có thể theo một cách nào đó không?Có thể lấy loại vùng chứa trong AutoFac

Ví dụ mã:

public class C1 
{ 
    public C1(Type type) {} 

    // ... 
} 

public class C2 
{ 
    public C2(C1 c1) {} 

    // ... 
} 

// Registration 
containerBuilder.Register(???); 
containerBuilder.Register<C2>(); 

Trả lời

7

này nên làm điều đó:

builder.RegisterType<C1>(); 
builder.RegisterType<C2>(); 
builder.RegisterModule(new ExposeRequestorTypeModule()); 

đâu:

class ExposeRequestorTypeModule : Autofac.Module 
{ 
    Parameter _exposeRequestorTypeParameter = new ResolvedParameter(
     (pi, c) => c.IsRegistered(pi.ParameterType), 
     (pi, c) => c.Resolve(
      pi.ParameterType, 
      TypedParameter.From(pi.Member.DeclaringType))); 

    protected override void AttachToComponentRegistration(
      IComponentRegistry registry, 
      IComponentRegistration registration) 
    { 
     registration.Preparing += (s, e) => { 
      e.Parameters = new[] { _exposeRequestorTypeParameter } 
       .Concat(e.Parameters); 
     }; 
    } 
} 

Bất kỳ thành phần mà phải mất một tham số System.Type sẽ nhận được các loại của người yêu cầu thông qua với nó (nếu có.) Một cải tiến có thể có thể là sử dụng NamedParameter thay vì hơn TypedParameter để hạn chế các thông số Type sẽ chỉ được đối sánh với những thông số có tên nhất định.

Vui lòng cho tôi biết nếu điều này có hiệu quả, những người khác đã hỏi về cùng một nhiệm vụ chung và điều này sẽ tốt để chia sẻ với họ.

+0

Không, thật không may, nó không hoạt động. LimitType là loại thành phần (C1 trong trường hợp này) – oryol

+0

Ah - doh! - cảm ơn vì điều đó. Tôi sẽ có một suy nghĩ về lựa chọn thay thế và gửi chúng ở đây nếu tôi tìm thấy bất kỳ. –

+0

Vấn đề chính là trong AutowiringParameter. Nó luôn luôn gọi giải quyết cho trẻ em mà không có tham số (với số đếm trống). Tôi tạo ra tham số tương tự và đăng ký nó trong registration.ActivatorData.ConfiguredParameters (nơi ActivatorData là ReflectionActivatorData) với giá trị: registration.ActivatorData.ImplementationType. Nhưng nó hoạt động chỉ cho rõ ràng c.Resolve (và với tiêm C1 chính nó tôi đã nhận 'Không của nhà thầu tìm thấy ...' cho C1) .. – oryol

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