[英]Dependency Injection (DI) in ASP.NET Core/MVC 6 ViewModel
我已使用構造函數注入在控制器中成功使用ASP.NET 5 / MVC 6 DI。
現在,我有一個場景,當實現IValidatableObject時,我希望我的視圖模型在Validate方法中使用服務。
ViewModel中的構造函數注入不起作用,因為它們需要默認的無參數構造函數。 驗證Context.GetService也不起作用。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
MyService myService = (MyService)validationContext.GetService(typeof(MyService));
總是導致MyService為null。
ASP.NET 4,我將創建ValidatableObjectAdapter,並通過DataAnnotationsModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory注冊它,然后我可以使用validationContext來對象對服務的引用。
我目前正在使用ASP.NET 5的DI容器中的構建,在某個階段將移至structuremap),但這並不重要。
我的特定驗證是對象的屬性(例如,用戶名)是唯一的。 我想將此測試委托給服務層。
從ASP.NET RC2開始,[FromServices]已被刪除。
如果只希望在ViewModels中為IValidatableObject.Validate提供DI,則可以使用validationContext.GetService(type)獲取服務。 這在RC1中不起作用
例如
MyService myService = (MyService)validationContext.GetService(typeof(myService));
這是一種通用的擴展方法,使它處理起來更加令人愉快。
public static class ValidationContextExtensions
{
public static T GetService<T>(this ValidationContext validationContext)
{
return (T)validationContext.GetService(typeof(T));
}
}
謝謝@odeToCode的回答。 為了完整起見,我將他的評論重新發布為我的(有效的)示例作為答案。 魔術是[FromServices]屬性。
public class CreateDynamicMappingProfileViewModel : IValidatableObject
{
[Display(Name = "Name", Order = 1), Required, MaxLength(50, ErrorMessage = "The name field allows a maximum of 50 characters")]
public string Name { get; set; }
[Display(Name = "Data Format", Order = 2), Required]
public DataFormat DataFormat { get; set; }
[Display(Name = "Data Context", Order = 3), Required]
public DataContextType DataContextType { get; set; }
[FromServices]
public IMappingProfileServices MappingProfileServices { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
IMappingProfile mappingProfile = new DynamicMappingProfile(Name, DataFormat, DataContextType);
return MappingProfileServices.ValidateCanSave(mappingProfile);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.