Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection Automapper与多租户应用程序-我们如何为每个租户提供自定义映射规则?_Dependency Injection_Automapper_Autofac_Multi Tenant - Fatal编程技术网

Dependency injection Automapper与多租户应用程序-我们如何为每个租户提供自定义映射规则?

Dependency injection Automapper与多租户应用程序-我们如何为每个租户提供自定义映射规则?,dependency-injection,automapper,autofac,multi-tenant,Dependency Injection,Automapper,Autofac,Multi Tenant,我们有一个多租户应用程序-它基于use AutoFac多租户加载项。我们还使用AutoMapper进行域到视图模型的映射 我们现在要求客户端为其ViewModel属性使用不同的映射规则/格式。e、 g.某个客户需要一个前缀为特定值的字段等。另一个客户需要一个值,如果不存在值,则用默认值替换。无论如何,这可以通过AutoMapper实现。似乎每个应用程序域都会配置一次配置,每个人都会获得相同的映射 是否仍需要配置默认映射,然后为每个租户配置覆盖?关于我们如何处理这件事有什么想法吗?理想情况下,使用

我们有一个多租户应用程序-它基于use AutoFac多租户加载项。我们还使用AutoMapper进行域到视图模型的映射

我们现在要求客户端为其ViewModel属性使用不同的映射规则/格式。e、 g.某个客户需要一个前缀为特定值的字段等。另一个客户需要一个值,如果不存在值,则用默认值替换。无论如何,这可以通过AutoMapper实现。似乎每个应用程序域都会配置一次配置,每个人都会获得相同的映射


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

您的第一步是告诉AutoMapper将依赖项解析绑定到服务构造中。您可以在MVC中通过以下方式实现:

AutoMapper.Mapper.Configuration.ConstructServicesUsing(
  t => DependencyResolver.Current.GetService(t));
接下来,使用基类或接口构建您的等,以便可以注入它们

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和多租户支持注册这些值解析程序

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);
var builder=newcontainerbuilder();
//在应用程序容器中注册默认值
builder.RegisterType().As();
var container=builder.Build();
var mtc=新的多租户容器(新租户策略(),容器);
//注册租户覆盖
mtc.ConfigureTenant(
‘租户1’,
b=>b.RegisterType().As());
//确保依赖项解析器是多租户的
var解析器=新的AutofacDependencyResolver(mtc);
DependencyResolver.SetResolver(解析器);
注册AutoMapper映射时,请确保使用基类而不是自定义值解析程序的特定类

Mapper.CreateMap<DataModel, ViewModel>()
  .ForMember(d => d.DisplayName,
             opt => opt.ResolveUsing<FormattingResolver>());
Mapper.CreateMap()
.FormMember(d=>d.DisplayName,
opt=>opt.resolvesusing());
现在,当AutoMapper执行映射操作时,它将通过调用
DependencyResolver.Current.GetService
获取自定义值解析器,Autofac multitenant容器将为租户返回适当的解析器。映射将使用特定租户的自定义值解析器,这意味着覆盖格式将按预期进行

我已经在我自己的几个应用程序中使用了它,而且效果非常好