Tôi nghĩ đây là ví dụ hoàn hảo cho việc sử dụng tùy chỉnh ISubDependencyResolver
. Bất cứ khi nào Castle sẽ không biết cách giải quyết một sự phụ thuộc cụ thể, nó sẽ giải quyết giải quyết tùy chỉnh đó. Người quyết định mới sẽ phụ thuộc vào Container Thống nhất và sẽ sử dụng nó để giải quyết "cho" Lâu đài.
Castle's documentation khẳng định rằng:
Nếu nơi trước đó đã không thể giải quyết phụ thuộc resolver sẽ hỏi mỗi tiểu phân giải của nó (ISubDependencyResolver) nếu họ có thể cung cấp các phụ thuộc.
Vì vậy, khi phụ thuộc đó sẽ không được tìm thấy trong Castle, nó sẽ tìm kiếm người giải quyết mới của bạn sẽ cung cấp sự phụ thuộc.
Dưới đây là một ví dụ làm việc với cả hai Constructor tiêm và tiêm tài sản:
class Program
{
static void Main(string[] args)
{
var unityContainer = new UnityContainer();
unityContainer.RegisterType<IDependency, Dependency1>();
unityContainer.RegisterType<IPropertyDependency, PropertyDependency1>();
WindsorContainer castleContainer = new WindsorContainer();
castleContainer.Kernel.Resolver.AddSubResolver(new UnityResolver(unityContainer));
castleContainer.Register(
Component.For<SomeType>());
var result = castleContainer.Resolve<SomeType>();
}
}
public interface IDependency { void Foo(); }
public class Dependency1 : IDependency { public void Foo() { } }
public interface IPropertyDependency { }
public class PropertyDependency1 : IPropertyDependency { }
public class SomeType
{
public SomeType(IDependency dependency) { ConstructorDependency = dependency; }
public IDependency ConstructorDependency { get; private set; }
public IPropertyDependency PropertyDependency { get; set; }
}
public class UnityResolver : ISubDependencyResolver
{
public UnityResolver(UnityContainer container)
{
Container = container;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return Container.Registrations.Any(z => z.RegisteredType.Equals(dependency.TargetType));
}
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return Container.Resolve(dependency.TargetType);
}
public UnityContainer Container { get; set; }
}
Và kết quả:
Đối với các mã cho kiểm tra Unity
cho CanResolve
- Tôi chắc chắn rằng nó có thể được cải thiện - tôi không k bây giờ nhiều về Unity
Nguồn
2016-10-05 11:44:54
Tôi đã thử điều này. Các ideea là ... Làm thế nào lâu đài biết rằng ông đã tiêm một giao diện cụ thể thông qua tiêm tài sản? Cách duy nhất anh có thể biết là bằng cách có giao diện đó trong bản đồ phụ thuộc. Nếu không, anh ta thậm chí sẽ không cố tiêm nó. –
@GeorgeLica - Đối với tài sản tiêm nó dường như không phải là một vấn đề - [Xem tài liệu] (https://github.com/castleproject/Windsor/blob/master/docs/how-dependencies-are-resolved .md # how-dependencies-are-resolve) –
@Alexandru Marculescu - Hãy xem xét trao giải thưởng tiền thưởng :) Câu trả lời giải quyết câu hỏi này –