5

Autofacを使用していますが、string型とlang型のパラメーターを要求するクラスがいくつかあります。「lang」という名前のすべてのパラメータに文字列値を登録して、自動的に解決する方法はありますか?私のコードではないので、コンストラクターを編集したくありません(たとえば、CultureInfoを受け入れると登録が簡単になることはわかっています)。

builder.Register(lang => "en-US")。As()。Named( "lang")のような短い構文になるもの

理想的です。

ありがとうございました。

4

2 に答える 2

10

これを解決するかなり簡単な方法は、カスタム Autofac モジュールを使用することです。

まず、モジュールを実装し、IComponentRegistration.Preparing イベントを処理します。これは、パラメーターの値を保存する場所でもあります。

using System;
using Autofac;
using Autofac.Core;

public class LangModule : Module:
{
  private string _lang;
  public LangModule(string lang)
  {
    this._lang = lang;
  }

  protected override void AttachToComponentRegistration(
    IComponentRegistry componentRegistry,
    IComponentRegistration registration)
  {
    // Any time a component is resolved, it goes through Preparing
    registration.Preparing += InjectLangParameter;
  }

  protected void InjectLangParameter(object sender, PreparingEventArgs e)
  {
    // Add your named parameter to the list of available parameters.
    e.Parameters = e.Parameters.Union(
      new[] { new NamedParameter("lang", this._lang) });
  }
}

カスタム モジュールが作成されたので、それを他の依存関係と共に登録し、注入する値を提供できます。

var builder = new ContainerBuilder();
builder.RegisterModule(new LangModule("my-language"));
builder.RegisterType<LangConsumer>();
...
var container = builder.Build();

文字列パラメーター「lang」を持つ型を解決すると、モジュールは指定した値を挿入します。

より具体的にする必要がある場合は、イベント ハンドラーで PreparingEventArgs を使用して、どの型が解決されているか ( e.Component.Activator.LimitType) などを判断できます。その後、パラメーターを含めるかどうかをその場で決定できます。

于 2012-04-24T15:56:26.287 に答える
0

この例を見てください:

builder.Register<ClassName>((c, p) =>
{
var p2 = p.Named<string>("lang");
return new ClassName(p2);
});
var container = builder.Build();
var m = container.Resolve<ClassName>(new NamedParameter("lang", "en-US"));
var m2 = container.Resolve<ClassName>(new NamedParameter("lang", "fr-FR"));

クラスを解決し、コンストラクターでパラメーターを渡すことができます。

于 2012-04-23T12:10:03.197 に答える