在我的ASP.NET MVC项目中,我有一个自定义的ModelMetadataProvider,它需要一个服务PropertyAccess。我目前正在使用构造器注入和IOC容器(Ninject)来完成这项繁琐的工作。问题是PropertyAccess是请求作用域,而我的ModelMetadataProvider只创建一次(在应用程序启动时)。这会导致PropertyAccess服务过期/不正确。
如果重要的话,下面是我如何在Global.asax中设置我的ModelMetadataProvider:
private void RegisterModelMetadataProvider()
{
var metadataProvider = DependencyResolver.Current.GetService<CustomModelMetadataProvider>();
ModelMetadataProviders.Current = metadataProvider;
}发布于 2012-10-06 02:38:11
我在回答我自己的问题(Q&A风格),但我不相信这是一个理想的解决方案。如果您有更好的方法(例如只需要配置的方法),请评论或留下替代答案。
不是直接将PropertyAccess传递给单例类,而是传入一个PropertyAccessLocator,它可用于根据需要获取当前请求的PropertyAccess。
这里是 PropertyAccessLocator
public class PropertyAccessLocator
{
public PropertyAccess Get()
{
return DependencyResolver.Current.GetService<PropertyAccess>();
}
}这里是一个示例ModelMetadataProvider
public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
private readonly PropertyAccessLocator _propertyAccessLocator;
public CustomModelMetadataProvider(
PropertyAccessLocator propertyAccessLocator)
{
_propertyAccessLocator = propertyAccessLocator;
// required because PropertyAccess is request scoped
// while this class is a singleton
}
protected override ModelMetadata CreateMetadata(
IEnumerable<Attribute> attributes,
Type containerType,
Func<object> modelAccessor,
Type modelType,
string propertyName)
{
var metadata = base.CreateMetadata(
attributes, containerType, modelAccessor, modelType, propertyName);
var propertyAccess = _propertyAccessLocator.Get();
// todo use propertyAccess to do something with the metadata...
return metadata;
}
}https://stackoverflow.com/questions/12752143
复制相似问题