0

私は次の設定を持っています:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity1" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
    <section name="unity2" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity1 configSource="unity1.config" />
  <unity2 configSource="unity2.config" />
</configuration>

unity1ファイルには次のようなものがあります(unity2は同じですが、明らかな場所に1ではなく2があります。

<?xml version="1.0" encoding="utf-8" ?>
<unity1 xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <alias alias="IInjectMe1" type="CommonLib.IInjectMe1, CommonLib"/>
  <container name="unity1">
    <register type="IInjectMe1" name="Injected1" mapTo="CommonLib.InjectMe1, CommonLib" />
  </container>
</unity1>

CommonLibというアセンブリの単一のクラスファイルにこのコードがあります。

        public void StartUp()
    {
        var config1 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity1");
        IUnityContainer container = new UnityContainer();
        config1.Configure(container, "unity1");

        var config2 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity2");
        config2.Configure(container, "unity2");

        var test1 = container.Resolve<InjectMe1>(); // WHY NOT THE INTERFACE??

        var test2 = container.Resolve<InjectMe2>(); // WHY NOT THE INTERFACE??

        Console.WriteLine(test1 != null && test2 != null);
    }
}

public class InjectMe1 : IInjectMe1 {}

public interface IInjectMe1 {}

public class InjectMe2 : IInjectMe2 {}

public interface IInjectMe2 {}

私の質問は、「なぜインターフェースではないのか」を上に置いたところに、なぜインターフェースの代わりに具象クラスを指定しなければならないのかということです。遅くなって木が見えないのは確かですが、コンクリートの種類を指定する必要があり、正しいコンクリートの種類が作成されます。インターフェイスを指定して解決させたい。

働きたいですcontainer.Resolve<IInjectMe1>()。インターフェイスのIに注意してください。

編集:上記を実行すると、エラーが発生します:

テストメソッドCommonLib.Tests.UnitTest1.TestMethod1が例外をスローしました:Microsoft.Practices.Unity.ResolutionFailedException:依存関係の解決に失敗しました。type= "CommonLib.IInjectMe1"、name = "(none)"。例外が発生しました:解決中。例外は次のとおりです。InvalidOperationException-現在のタイプCommonLib.IInjectMe1はインターフェイスであり、構築できません。タイプマッピングがありませんか?

4

1 に答える 1

1

手元にコンパイラはありませんが、XMLからname="Injected1"を削除する必要があると思います。

名前付き登録を作成することにより、名前付き解決に制限されます。しかし、どうやら、デフォルトの登録を解決します。

于 2013-03-10T22:09:20.417 に答える