私は属性を使用することもあまり好きではありませんが.Configure<InjectedMembers>()
、特定のプロパティ名と特定の値にバインドされているため、メソッドも好きではありません。私が見つけた最も柔軟な方法は、独自のビルダー戦略を作成することです。
構築中のオブジェクトのプロパティを反復処理し、そのプロパティの型が unity コンテナーに登録されている場合にそのプロパティ値を設定する、この単純なクラスを作成しました。
public class PropertyInjectionBuilderStrategy:BuilderStrategy
{
private readonly IUnityContainer _unityContainer;
public PropertyInjectionBuilderStrategy(IUnityContainer unityContainer)
{
_unityContainer = unityContainer;
}
public override void PreBuildUp(IBuilderContext context)
{
if(!context.BuildKey.Type.FullName.StartsWith("Microsoft.Practices"))
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(context.BuildKey.Type);
foreach (PropertyDescriptor property in properties)
{
if(_unityContainer.IsRegistered(property.PropertyType)
&& property.GetValue(context.Existing) == null)
{
property.SetValue(context.Existing,_unityContainer.Resolve(property.PropertyType));
}
}
}
}
}
BuilderStrategy
を作成して登録しますUnityContainerExtension
。次に例を示します。
public class TestAppUnityContainerExtension:UnityContainerExtension
{
protected override void Initialize()
{
Context.Strategies.Add(new PropertyInjectionBuilderStrategy(Container), UnityBuildStage.Initialization);
}
}
これは、Unity コンテナーに次のように登録されます。
IUnityContainer container = new UnityContainer();
container.AddNewExtension<TestAppUnityContainerExtension>();
これが役に立てば幸いです、
マシュー