首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义ModelMetadataProvider是一个单例,但它依赖于请求范围的服务

自定义ModelMetadataProvider是一个单例,但它依赖于请求范围的服务
EN

Stack Overflow用户
提问于 2012-10-06 02:38:11
回答 1查看 678关注 0票数 2

在我的ASP.NET MVC项目中,我有一个自定义的ModelMetadataProvider,它需要一个服务PropertyAccess。我目前正在使用构造器注入和IOC容器(Ninject)来完成这项繁琐的工作。问题是PropertyAccess是请求作用域,而我的ModelMetadataProvider只创建一次(在应用程序启动时)。这会导致PropertyAccess服务过期/不正确。

如果重要的话,下面是我如何在Global.asax中设置我的ModelMetadataProvider:

代码语言:javascript
复制
private void RegisterModelMetadataProvider()
{
    var metadataProvider = DependencyResolver.Current.GetService<CustomModelMetadataProvider>();
    ModelMetadataProviders.Current = metadataProvider;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-06 02:38:11

我在回答我自己的问题(Q&A风格),但我不相信这是一个理想的解决方案。如果您有更好的方法(例如只需要配置的方法),请评论或留下替代答案。

不是直接将PropertyAccess传递给单例类,而是传入一个PropertyAccessLocator,它可用于根据需要获取当前请求的PropertyAccess

这里是 PropertyAccessLocator

代码语言:javascript
复制
public class PropertyAccessLocator
{
    public PropertyAccess Get()
    {
        return DependencyResolver.Current.GetService<PropertyAccess>();
    }
}

这里是一个示例ModelMetadataProvider

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12752143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档