0

簡単だと思いますが、これを行う正確な仕組みはわかりません(質問のタイトルを参照)。

それが機能する方法は次のようになります。

[AutoInjectProperties]
public class C
{
  public class C(bool b)
  {
    if(b)
    {
      this.MyClass3 = new MyClass3(); // prevents auto inject
    }
  }
  public MyClass1 { get; set; } // auto inject
  public MyClass2 { get; }
  public MyClass3 { get; set; } // auto inject if null after construction
}
4

1 に答える 1

2

私はまったく使用しませんDependencyAttributeこれは推奨される方法ではありませんDependencyProperty代わりにを使用してください。

container.RegisterType<IMyInterface, MyImplementation>(new DependencyProperty("Foo"));

注入する依存関係が必須の場合は、プロパティ注入の代わりにコンストラクター注入を使用する必要があります。Unity はコンストラクターのパラメーターを独自に計算します。

public class MyImplementation
{
  private readonly IFoo foo;
  public MyImplementation(IFoo foo)
  {
    if(foo == null) throw new ArgumentNullException("foo");
    this.foo = foo;
  }
  public IFoo Foo { get { return this.foo; } }
}

IFoo解決する前に登録するMyImplementationと、Unity がその仕事を行い、それを注入します。


アップデート

public class AllProperties : InjectionMember
{
  private readonly List<InjectionProperty> properties;
  public AllProperties()
  {
    this.properties = new List<InjectionProperty>();
  }
  public override void AddPolicies(Type serviceType, Type implementationType, string name, IPolicyList policies)
  {
    if(implementationType == null)throw new ArgumentNullException("implementationType");
    // get all properties that have a setter and are not indexers
    var settableProperties = implementationType
      .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
      .Where(pi => pi.CanWrite && pi.GetSetMethod(false) != null && pi.GetIndexParameters().Length == 0);
    // let the Unity infrastructure do the heavy lifting for you
    foreach (PropertyInfo property in settableProperties)
    {
      this.properties.Add(new InjectionProperty(property.Name));
    }
    this.properties.ForEach(p => p.AddPolicies(serviceType, implementationType, name, policies));
  }
}

そんな使い方

container.RegisterType<Foo>(new AllProperties());

パブリック セッターを持つすべてのプロパティを挿入します。

于 2012-04-12T07:35:18.687 に答える