Enter a string value for a specific parameter name

I use Autofac, and I have several classes that request a parameter of type string and name lang. Is there a way to register a string value for all parameters named "lang" so it is automatically resolved? I do not want to edit any of the constructors, since this is not my code (I know that a technique, for example, CultureInfo will make registration easier).

Something that leads to a short syntax, for example builder.Register (lang => "en-US"). As (). Named ("lang")

will be perfect.

Thank.

+3
source share
2 answers

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", .

, PrepingEventArgs , , (e.Component.Activator.LimitType) .. , .

+8

:

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"));

.

0

All Articles