1

Unity BuildUp メソッドに奇妙な問題があります。3 つのクラスにマップされた 1 つのインターフェイスがあります。各マッピングに名前を付けました。

ここで、既存のオブジェクトに依存関係を注入する必要があります (これは属性であるため、有効期間を制御することはできません)。BuildUp メソッドを呼び出して依存関係を挿入しますが、インターフェイスがマップされていないことを示す例外が常にスローされます。

インターフェイスを 1 つのタイプのみにマップし、マッピング名を削除すると、BuildUp メソッドが機能します。インターフェイスを 1 つのタイプのみにマップし、マッピング名を指定すると、BuildUp メソッドは失敗します。構成とコードに型を登録しようとしましたが、何も変わりません。

これはバグだと思いますが、他の誰かが別の考えを持っているかどうか知りたいです.

これは私が buildup メソッドを呼び出す方法です:

var newAttr = _container.BuildUp(myAttribute.GetType(), myAttribute, "Mapping1");
4

1 に答える 1

1

私はあなたのシナリオに従おうとしましたが、このサンプルは機能します

var container = new UnityContainer();
container.RegisterType<IFoo, One>("1", new InjectionProperty("Bar", "1"));
container.RegisterType<IFoo, Two>("2", new InjectionProperty("Bar", "2"));
container.RegisterType<IFoo, Three>("3", new InjectionProperty("Bar", "3"));
One one = new One();
container.BuildUp(one.GetType(), one, "1");
Assert.AreEqual("1", one.Bar);

public interface IFoo
{
    string Bar { get; set; }
}
public class One : IFoo
{
    public string Bar { get; set; }
}
public class Two : IFoo
{
    public string Bar { get; set; }
}
public class Three : IFoo
{
    public string Bar { get; set; }
}

アップデート

var container = new UnityContainer();
container.RegisterType<Person>(new InjectionProperty("Foo"));
container.RegisterType<IFoo, One>("1");
container.RegisterType<IFoo, Two>("2");
container.RegisterType<IFoo, Three>("3");
Person person = container.Resolve<Person>("1");
Assert.IsNotNull(person.Foo);
Assert.IsInstanceOfType(person.Foo, typeof(One));

public class Person
{
  public IFoo Foo { get; set; }
}

私はこれがあなたが意味するものだと思いますか?簡単な答え: それは Unity の仕組みではありません。

長い答え: それを行う a を指定する必要がありResolverOverrideます。しかし、コンテナに注入したい値を作成させたいので、それでも十分ではありません。ResolvedParameterしたがって、 の値としてa を指定する必要がありますResolverOverride。Unity のすぐに使えるパーツを使用すると、次のResolveようになります。

Person person = container.Resolve<Person>(new PropertyOverride("Foo", new ResolvedParameter(typeof(IFoo), "1")));

または、代わりにこのカスタムオーバーライドを使用できます

public class NamedPropertyOverride : ResolverOverride
{
  private readonly string propertyName;
  private readonly string registrationName;
  public NamedPropertyOverride(string propertyName, string registrationName)
  {
    this.propertyName = propertyName;
    this.registrationName = registrationName;
  }
  public override IDependencyResolverPolicy GetResolver(IBuilderContext context, Type dependencyType)
  {
    var currentOperation = context.CurrentOperation as ResolvingPropertyValueOperation;
    if (currentOperation != null && 
        currentOperation.PropertyName == this.propertyName)
    {
      Type propertyType = currentOperation
        .TypeBeingConstructed
        .GetProperty(currentOperation.PropertyName, BindingFlags.Instance | BindingFlags.Public)
        .PropertyType;
      return new NamedTypeDependencyResolverPolicy(propertyType, this.registrationName);
    }
    return null;
  }
}

Resolve上記のサンプルの呼び出しを含む行を次の行に変更します

Person person = container.Resolve<Person>(new NamedPropertyOverride("Foo", "1"));

これでうまくいくはずです。

于 2012-04-23T13:15:26.657 に答える