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ọ.
Nguồn
2011-01-23 22:21:23
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
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ỳ. –
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