2

インターフェースを検討してください:

public interface IOne{}
public interface ITwo{}
public interface IBoth : IOne, ITwo{}

そしてクラス

public class Both : IBoth{}

ただし、基本インターフェイスを解決する必要がある場合は、両方のインターフェイスをコンテナーに登録する必要があります

<register type="IOne" MapTo="Both"/>
<register type="ITwo" MapTo="Both"/>

問題は、次のような方法で登録を重複排除できるかどうかです。

<register type="IBoth" MapTo="Both"/>

ただし、さまざまなインターフェイスからさまざまな場所で解決します。

var o = containet.Resolve<IOne>();
var t = containet.Resolve<ITwo>();

このシナリオが機能しないので、他の方法でそのようなトリックを行うことはできますか?...

4

1 に答える 1

3

簡単な答え:できません。長い答え:この種のトリックを実行するカスタムコンテナ拡張機能を作成できます。

[TestMethod]
public void TestMethod1()
{
  var container = new UnityContainer().AddNewExtension<DeduplicateRegistrations>();
  container.RegisterType<IBoth, Both>();
  IThree three = container.Resolve<IThree>();
  Assert.AreEqual("3", three.Three());
}

public class DeduplicateRegistrations : UnityContainerExtension
{
  protected override void Initialize()
  {
    this.Context.Registering += OnRegistering;
  }
  private void OnRegistering(object sender, RegisterEventArgs e)
  {
    if (e.TypeFrom.IsInterface)
    {
      Type[] interfaces = e.TypeFrom.GetInterfaces();
      foreach (var @interface in interfaces)
      {
        this.Context.RegisterNamedType(@interface, null);
        if (e.TypeFrom.IsGenericTypeDefinition && e.TypeTo.IsGenericTypeDefinition)
        {
          this.Context.Policies.Set<IBuildKeyMappingPolicy>(
            new GenericTypeBuildKeyMappingPolicy(new NamedTypeBuildKey(e.TypeTo)),
            new NamedTypeBuildKey(@interface, null));
        }
        else
        {
          this.Context.Policies.Set<IBuildKeyMappingPolicy>(
            new BuildKeyMappingPolicy(new NamedTypeBuildKey(e.TypeTo)),
            new NamedTypeBuildKey(@interface, null));
        }
      }
    }
  }
}
public class Both : IBoth
{
  public string One() { return "1"; }
  public string Two() { return "2"; }
  public string Three() { return "3"; }
}
public interface IOne : IThree
{
  string One();
}
public interface IThree
{
  string Three();
}
public interface ITwo
{
  string Two();
}
public interface IBoth : IOne, ITwo
{
}

IDisposable特定のインターフェイスの既存の登録のようなインターフェイスの登録をキャッチしたり、既存の登録を上書きしたりするには、拡張機能を微調整する必要があります。

于 2012-10-04T10:08:01.697 に答える