[私は自分の質問(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;
}
}