簡體   English   中英

ASP.NET Core / MVC 6 ViewModel中的依賴項注入(DI)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM