您的第一步是告诉 AutoMapper 绑定到依赖项解析以进行服务构建。你可以在 MVC 中这样做:
AutoMapper.Mapper.Configuration.ConstructServicesUsing(
t => DependencyResolver.Current.GetService(t));
接下来,使用基类或接口构造您的custom value resolvers 等,以便可以注入它们。
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);
注册 AutoMapper 映射时,请确保使用基类,而不是自定义值解析器的特定类。
Mapper.CreateMap<DataModel, ViewModel>()
.ForMember(d => d.DisplayName,
opt => opt.ResolveUsing<FormattingResolver>());
现在当 AutoMapper 执行映射操作时,它将通过调用 DependencyResolver.Current.GetService 获取自定义值解析器,并且 Autofac 多租户容器将为租户返回适当的解析器。映射将使用特定租户的自定义值解析器,这意味着覆盖格式将按预期进行。
我在我自己的几个应用程序中都有这个功能,效果很好。