2013-10-15 71 views
0

我正在使用ASP.NET MVC網站,我們正在使用DI將必要的組件注入到控制器中。將ModelState傳遞到業務層

我現在面臨的挑戰是我想將服務提供者注入控制器,並將一個「UserRequestContext」對象注入到服務提供者中。這個UserRequestContext對象封裝了當前的用戶ID,電子郵件地址,角色,並傳遞了modelstate對象(或者至少,我希望它)。我想在我的服務提供者層執行所有驗證操作。

問題當然是,我的服務提供者對象必須在控制器之前實例化,並且因爲在創建控制器之前ModelState不存在,所以我無法創建UserRequestContext對象。

我的目標是消除需要將IUserRequestContext對象傳遞給IServiceProvider的每個方法。

取而代之的是: void ServiceProvider.CreateUser(User user,IUserRequestContext userRequestContext);

使用此: 無效ServiceProvider.CreateUser(用戶用戶)

這是我在這一點上整理了一下代碼:

public class HomeController 
{  
    public HomeController(IServiceProvider provider) 
    { 
     _provider = provider; 
    } 

    private IServiceProvider _provider; 
} 

public class ServiceProvider : IServiceProvider 
{ 
    private IUserRequestContext _userRequestContext; 

    public ServiceProvider(IUserRequestContext userRequestContext) 
    { 
     _userRequestContext = userRequestContext; 
    } 
} 

public class UserRequestContext : IUserRequestContext 
{ 
    private ModelStateDictionary _modelState; 

    public UserRequestContext(ModelStateDictionary modelState) 
    { 
     _modelState = modelState; 
    } 

    public void AddError(string key, string errorMessage) 
    { 
     _modelState.AddModelError(key, errorMessage); 
    } 

    // the rest removed for brevity 
} 

回答

0

我看不出什麼錯。我在我的代碼中遵循了非常類似的模式。

我創建了一個IModelState接口,我通過我的服務。我爲ModelStateDictionary創建了一個擴展方法,將其封裝到實現接口的幫助類中。我現在可以這樣做:

public class mycontroller 
{ 
    private readonly IService _service; 

... 

    public ActionResult myaction() 
    { 
     _service.dowork(ModelState.ToWrapper()) 
....