简介:
我有一个Asp.Net MVC
项目AutoMapper
和IOC
( StructureMap ),而且每件事都运作良好。
我宣布了一些AutoMapper Profiles
并在IOC
注册了它们,最后在某些类的承包商中使用IMappingEngine
来使用AutoMapper
。
AutoMapper Version: 4.0.4
StructureMap Version: 4.2.0.402
问题:
我希望根据当前用户的时区声明为所有AutoMapper配置文件设置全局转换配置。
此AutoMapper转换配置的规则:
- 应该是所有AutoMapper配置文件的全局配置
- 应该是项目中的某个位置,每次用户向我们发送请求时,我们都会通过用户时区声明进行设置
- 不应该影响其他在线用户的AutoMapper配置(它不应该是对单个对象的设置 IOC中的AutoMapper)
我做了什么:
我在OnAuthorization
继承的类的AuthorizeAttribute
方法中编写以下配置,并在项目的Controller
类中使用此属性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public sealed class Mcv5AuthorizeAttribute : AuthorizeAttribute
{
public Mcv5AuthorizeAttribute(): base(){}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var ct = filterContext.HttpContext;
if (ct.Request.IsAuthenticated)
{
Mapper.Initialize(conf => conf.CreateMap<DateTime, string>().ConvertUsing(new MyDateTimeConverter(ct.User.GetUserTimezoneId())));
// Other codes
}
}
}
我还想把上面的代码放在 Base Controller
或 Controller Factory
中。
我的问题:
IOC
,剂量Mapper.Initialize
也影响其他在线用户的AutoMapper
配置? AutoMapper
转换配置以符合上述规则?Base Controller
, Controller Factory
,自定义 AuthorizeAttribute
或......)?更新
我真的想要定义一些 custom type converter in AutoMapper 。您可以阅读它并查看ITypeConverter
之类的ITypeConverter<string, DateTime>
转换器。但是我找到了一种方法来参与我的TypeConverter
参数,并根据用户的设置动态地将一些参数传递给它们,就像它们全局工作一样个人资料但限制在当前用户范围内。
也许国际奥委会可以这样帮助我。你有什么想法吗?
无论如何,我认为如果我通过Mapper.Initialize
注册转换器,它也会影响其他在线用户,因为AutoMapper被IOC视为singelton对象。我正在寻找一种方法来遵守所有提到的规则。
答案 0 :(得分:0)
每个AppDomain应调用一次Initialize。您可以通过Context.Items为每个Map调用传递参数。您可以在解析器/转换器中检查这些参数。您还可以使用依赖注入来通过注入每个请求帮助程序来实现相同的功能。文档为here。