필자는 모델 바인더가 종속성 삽입을 통하지 않고 모델 바인더 공급자로부터 얻어 졌다는 것을 알게되었습니다. FooModelBinder
을 올바르게 인스턴스화하려면 FooModelBinderProvider
을 만들어야합니다. 그리고 구성을 위해 ComplexTypeModelBinder
의 인스턴스를 제대로 얻으려면 내 제공자가 ComplexTypeModelBinderProvider
에 액세스해야합니다. 즉, 모델 바인더를 통해 작성하려면 모델 바인더 공급자를 통해 작성해야합니다.
여기 제공자가 있습니다. 우리는 다른 모델 바인더의 기존 기능을 단순히 래핑하기 때문에 삽입 된 공급자의 정확한 유형을 지정할 필요가 없습니다.
public class FooModelBinderProvider : IModelBinderProvider
{
private readonly IModelBinderProvider workerProvider;
public FooModelBinderProvider(IModelBinderProvider workerProvider)
{
this.workerProvider = workerProvider;
}
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.Metadata.ModelType == typeof(Foo))
{
return new FooModelBinder(this.workerProvider.GetBinder(context));
}
return null;
}
}
그리고 여기에 바인더가 있습니다. 우리가 BindModelAsync
에서 수행하는 첫 번째 작업은 "작업자"바인더에 대한 트램펄린입니다.
services.AddMvc(options =>
{
var workerProvider = options.ModelBinderProviders.First(p => p.GetType() == typeof(ComplexTypeModelBinderProvider));
options.ModelBinderProviders.Insert(options.ModelBinderProviders.IndexOf(workerProvider), new FooModelBinderProvider(workerProvider));
})
:
public class FooModelBinder : IModelBinder
{
private readonly IModelBinder worker;
public FooModelBinder(IModelBinder worker)
{
this.worker = worker;
}
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
await this.worker.BindModelAsync(bindingContext);
if (!bindingContext.Result.IsModelSet)
{
return;
}
var foo = bindingContext.Result.Model as Foo;
if (foo == null)
{
throw new InvalidOperationException($"Expected {bindingContext.ModelName} to have been bound by ComplexTypeModelBinder");
}
// NOW DO SOME INTERESTING POST-PROCESSING
}
}
마지막으로, 여기에 사용자 정의 바인더를 등록하는 방법