14

私は 1 つのインターフェイスを持っていIFoo
ます: そのインターフェイスを実装する 2 つのクラス:FooOneそしてFooTwo
2 つのクラスClassOneとコンストラクターでパラメーター をClassTwo受け取ります。IFoo

ClassOneUnity を構成してFooOneインスタンスをClassTwo受け取り、FooTwo1 つのコンテナーのみを使用して受け取るようにするにはどうすればよいですか?

実行時に実行できないため、構成ファイルにある必要があります。

4

3 に答える 3

18

Unity のドキュメントをご覧ください。

より読みやすい構成ファイルを作成するには、 、 、 、および の型エイリアスを定義するIFoo必要FooOneFooTwoありClassOneますClassTwo。次に、実装へのマッピングを登録する必要がありIFooます。nameマッピングに を設定する必要があります。の消費者のIFoo場合、 を登録する必要がありますInjectionConstructor

設定は次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
      Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IFoo" type="UnityConfigFile.IFoo, UnityConfigFile" />
    <alias alias="FooOne" type="UnityConfigFile.FooOne, UnityConfigFile" />
    <alias alias="FooTwo" type="UnityConfigFile.FooTwo, UnityConfigFile" />
    <alias alias="ClassOne" type="UnityConfigFile.ClassOne, UnityConfigFile" />
    <alias alias="ClassTwo" type="UnityConfigFile.ClassTwo, UnityConfigFile" />
    <container>
      <register type="IFoo" name="1" mapTo="FooOne" />
      <register type="IFoo" name="2" mapTo="FooTwo" />
      <register type="ClassOne" mapTo="ClassOne">
        <constructor>
          <param name="foo">
            <dependency type="IFoo" name="1" />
          </param>
        </constructor>
      </register>
      <register type="ClassTwo" mapTo="ClassTwo">
        <constructor>
          <param name="foo">
            <dependency type="IFoo" name="2" />
          </param>
        </constructor>
      </register>
    </container>
  </unity>
</configuration>

それがどのように機能するかを示す対応するテストです。

UnityConfigurationSection config =
  (UnityConfigurationSection) ConfigurationManager.GetSection("unity");
IUnityContainer container = new UnityContainer();
container.LoadConfiguration(config);
ClassTwo two = container.Resolve<ClassTwo>();
Assert.IsInstanceOfType(two.Foo, typeof(FooTwo));

アップデート

実行時には、このようにすることができます

IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, FooOne>("One");
container.RegisterType<IFoo, FooTwo>("Two");
container.RegisterType<ClassOne>(new InjectionConstructor(
  new ResolvedParameter<IFoo>("One")));
container.RegisterType<ClassTwo>(new InjectionConstructor(
  new ResolvedParameter<IFoo>("Two")));
于 2012-10-30T10:00:20.300 に答える
5

これを行うには、登録名を指定する必要があります。

// Create an instance of a service you want to use. Alternatively, this
// may have been created by another process and passed to your application
LoggingService myLoggingService = new LoggingService();

// Register the existing object instance with the container
container.RegisterInstance<IMyService>("Logging", myLoggingService);

// Register a mapping for another service your application will use
container.RegisterType<IMyService, myDataService>("DataService");

// When required, retrieve an instance of these services
IMyService theDataService = container.Resolve<IMyService>("DataService");
IMyService theLoggingService = container.Resolve<IMyService>("Logging");

Unity を使用した型のインスタンスの解決から取得

于 2012-10-29T22:36:09.243 に答える