3

Unity 3 は、次のような AutoRegistration (Registration by Convention) の新しい機能を提供します。

container.RegisterTypes(
    AllClasses.FromLoadedAssemblies(),  //uses reflection
    WithMappings.FromMatchingInterface, //Matches Interfaces to implementations by name
    WithName.Default);

このコードは、同様の名前のインターフェイスを実装するすべての型を、それらのインターフェイスに対して登録します。たとえば、クラス MyService : IMyServiceは、次のように記述した場合と同様に自動的に登録されます。

container.RegisterType<IMyService, MyService >();

私の質問: ほとんどの場合これが必要ですが、同様の名前の実装が存在する場合でも、インターフェイスの 1 つに別の実装を選択したい場合はどうすればよいですか?

参照: CodePlex のパターンとプラクティス

これを行う理由を説明する重要な記事は、Jeremy Miller の Convention Over Configuration 記事です。

4

3 に答える 3

4

Unity は常に、構成に「最後に勝つ」ルールを使用してきました。そのため、最初にコンテナで autoconfig を実行してから、後でオーバーライドを実行してください。最後に設定された構成は (それがどのように発生したかに関係なく) コンテナー内の構成になります。

于 2013-04-30T17:59:38.887 に答える
1

構成からロードされたカスタムセットで自動マッピングをオーバーライドできない理由 (空の場合、デフォルトのマッピングがオーバーライドされないことを意味します):

 // have your auto registration
 container.RegisterTypes(
   AllClasses.FromLoadedAssemblies(),  //uses reflection
   WithMappings.FromMatchingInterface, //Matches Interfaces to implementations by name
   WithName.Default);

 // and override it when necessary
 container.LoadConfiguration();

構成はどこにありますか

<?xml version="1.0" encoding="utf-8" ?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
    <register type="IMyService" mapTo="OverriddenServiceImpl" />
</container>
</unity>

また

<?xml version="1.0" encoding="utf-8" ?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
        ...nothing, do not override defaults ...
</container>
</unity>

オプションの構成を XML ファイルに移動すると、システムを再コンパイルせずに再構成できるという利点があります。

于 2013-04-30T12:16:53.967 に答える