1

IEmailService を実装する EmailService があるとします。また、EmailService には ILoggingService に対するコンストラクターの依存関係があります。ILoggingService の実装がいくつかあるので、次のようなことを実現できます。

<component service="IEmailService, MyInterfaces" type="EmailService, MyLib">
  <parameters>
    <parameter name="loggingService" value="LoggingService, MyLib" />
  </parameters>
</component>

登録された型に名前を付ける方法を調べましたが、これまでのところ、XML 構成からそれらを使用する方法の例を見つけることができませんでした。

要するに、XML 構成を使用して、どの具体的なロガー実装が注入されるかを指定したいと考えています。

4

1 に答える 1

3

Autofac での XML 構成は、XML 形式での Autofac の柔軟性の完全な実装ではなく、80% のユース ケースを対象としています。代わりに Autofac は、構成にモジュール メカニズムを使用することを推奨しています。モジュールを XML 構成と組み合わせると、目的を達成するための非常に強力な方法となり、必要に応じて依存関係を切り替える柔軟性も備えています。

まず、必要な登録を行う Autofac モジュールを作成します。

public class EmailModule
{
  protected override void Load(ContainerBuilder builder)
  {
    // Register a named logging service so we can locate
    // this specific one later.
    builder.RegisterType<LoggingService>()
           .Named<ILoggingService>("emailLogger");

    // Create a ResolvedParameter we can use to force resolution
    // of the constructor parameter to the named logger type.
    var loggingServiceParameter = new ResolvedParameter(
      (pi, ctx) => pi.Name == "loggingService",
      (pi, ctx) => ctx.ResolveNamed<ILoggingService>("emailLogger"));

    // Add the ResolvedParameter to the type registration so it
    // knows to use it when resolving.
    builder.RegisterType<EmailService>()
           .As<IEmailService>()
           .WithParameter(loggingServiceParameter);
  }
}

非常に具体的な解決策が必要なため、登録が少し複雑であることに注意してください。

XML 構成で、そのモジュールを登録します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section
      name="autofac"
      type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>
  <autofac>
    <modules>
      <module type="EmailModule, MyAssembly" />
    </modules>
  </autofac>
</configuration>

構成を切り替えたい場合は、特定のコンポーネント レジストリをいじるのではなく、別のモジュールを登録します。

コードの免責事項: 私は記憶から構文を書いていますが、私はコンパイラではありませんモジュールの複雑さを分離してから、モジュールを登録します。

于 2012-05-18T15:11:19.613 に答える