2

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

万一这很重要,这是我在 Global.asax 中设置 ModelMetadataProvider 的方式:

private void RegisterModelMetadataProvider()
{
    var metadataProvider = DependencyResolver.Current.GetService<CustomModelMetadataProvider>();
    ModelMetadataProviders.Current = metadataProvider;
}
4

1 回答 1

1

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

不是PropertyAccess直接传递给单例类,而是传递 a 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;
    }
}
于 2012-10-05T18:38:11.173 回答