dependency-injection - 具有 Multi-Tenancy 应用程序的自动映射器 - 我们如何为每个租户提供自定义映射规则?

标签 dependency-injection automapper autofac multi-tenant

我们有一个 Multi-Tenancy 应用程序 - 它基于 AutoFac Multi-Tenancy 插件。我们还使用 AutoMapper 进行域到 ViewModel 的映射。

我们现在收到客户请求,要求其 ViewModel 属性具有不同的映射规则/格式。例如某个客户想要一个以特定值等为前缀的字段。另一个客户希望在不存在值的情况下用默认值替换一个值。无论如何,这可以通过 AutoMapper 来完成。配置似乎每个应用程序域配置一次,每个人都获得相同的映射。

是否可以配置默认映射,然后为每个租户进行覆盖?关于我们如何处理这个问题有什么想法吗?理想情况下,使用 DI 从租户子容器中提取一些额外的映射。

最佳答案

您的第一步是告诉 AutoMapper 结合依赖关系解析来构建服务。您可以在 MVC 中使用如下方法来做到这一点:

AutoMapper.Mapper.Configuration.ConstructServicesUsing(
  t => DependencyResolver.Current.GetService(t));

接下来,构建您的 custom value resolvers等等使用基类或接口(interface),以便可以注入(inject)它们。

public abstract class FormattingResolver : IValueResolver
{
  public ResolutionResult Resolve(ResolutionResult source)
  {
    return source.New(this.Format(source.Value.ToString()));
  }

  public abstract string Format(string input);
}

public class DefaultFormatter : FormattingResolver
{
  public override string Format(string input)
  {
    return input + "Default";
  }
}

public class Tenant1Formatter : FormattingResolver
{
  public override string Format(string input)
  {
    return input + "Tenant 1";
  }
}

现在使用 Autofac 和 Multi-Tenancy 支持注册这些值解析器。

var builder = new ContainerBuilder();

// Register the default in the app container
builder.RegisterType<DefaultFormatter>().As<FormattingResolver>();

var container = builder.Build();
var mtc = new MultitenantContainer(new TenantIdStrategy(), container);

// Register the tenant override
mtc.ConfigureTenant(
  'Tenant1',
  b => b.RegisterType<Tenant1Formatter>().As<FormattingResolver>());

// Make sure the dependency resolver is multitenant
var resolver = new AutofacDependencyResolver(mtc);
DependencyResolver.SetResolver(resolver);

注册 AutoMapper 映射时,请确保使用基类而不是自定义值解析器的特定类。

Mapper.CreateMap<DataModel, ViewModel>()
  .ForMember(d => d.DisplayName,
             opt => opt.ResolveUsing<FormattingResolver>());

现在AutoMapper执行映射操作时,会通过调用DependencyResolver.Current.GetService来获取自定义值解析器Autofac Multi-Tenancy 容器将为租户返回适当的解析器。映射将使用特定租户的自定义值解析器,这意味着覆盖格式将按预期进行。

我已经在我自己的几个应用程序中使用了它,并且效果很好。

关于dependency-injection - 具有 Multi-Tenancy 应用程序的自动映射器 - 我们如何为每个租户提供自定义映射规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17321577/

相关文章:

c# - 是否可以从 Autofac 容器构建器中删除现有注册?

asp.net-mvc - 针对各种应用程序的 Autofac 模块扫描

c# - 如何强制 DI 风格

c# - 如何在类库项目中配置自动映射器?

c# - 依赖注入(inject)与分层架构

AutoMapper 逗号分隔字符串

entity-framework - 如何使用 AutoMapper 映射外键值?

c# - Presenter 的依赖注入(inject)

java - Google 云端点和依赖项注入(inject)

php - Symfony2 如何在 Controller 中注入(inject)请求并获取路由参数