2015-10-06 93 views
3

爲了讓自己更容易對我的應用程序進行單元測試,我試圖通過將我的數據訪問功能移動到單獨的存儲庫類中來實現存儲庫模式。在我的倉庫不調用ASP MVC控制器

我的數據訪問類:

public class ErrorRepository : IErrorRepository 
{ 
    public ErrorModel Errors { get; set; } 
    public List<ErrorModel> ErrorList { get; set; } 

    public List<ErrorModel> GetErrors() 
    { 
     string cs = "some path"; 

     using (SQLiteConnection con = new SQLiteConnection(cs)) 
     { 
      var listOfErrors = new List<ErrorModel>(); 
      string stm = "SELECT * FROM Error WHERE Checked == 'False'"; 
      con.Open(); 

      using (SQLiteCommand cmd = new SQLiteCommand(stm, con)) 
      { 
       using (SQLiteDataReader rdr = cmd.ExecuteReader()) 
       { 
        while (rdr.Read()) 
        { 
         listOfErrors.Add(new ErrorModel 
         { 
          Id = rdr["ID"].ToString() 
         }); 
        } 

        rdr.Close(); 
        ErrorList = listOfErrors; 
       } 
      } 

      con.Close(); 
     } 

     return ErrorList; 
    } 
} 

public interface IErrorRepository 
{ 
    List<ErrorModel> GetErrors(); 
} 

我的控制器:

public class ErrorController : Controller 
{ 
    private IErrorRepository _errorRepository; 

    public ErrorController(IErrorRepository errorRepository) 
    { 
     _errorRepository = errorRepository; 
    } 

    public ActionResult Error(int? page) 
    { 
     var errors = _errorRepository.GetErrors(); 

     //// stuff for paging 
     int pageSize = 10; 
     int pageNumber = (page ?? 1); // if there is no page, return page 1 

     return View(errors.ToPagedList(pageNumber, pageSize)); 
    } 
} 

但事實是,控制器是永遠不會被調用。

我已經改變它從以前的版本控制器負責一切。所以我所做的只是將訪問的數據移到了一個單獨的類中。錯誤視圖與以前相同。我在執行中錯過了一些細節嗎?

UPDATE:

我撥弄與周圍的構造一點,我有幾個問題。爲什麼下面的代碼,我把它注射在構造函數中不起作用:

public ErrorController(IErrorRepository _errorRepository) 
    { 
     this._errorRepository = _errorRepository; 
    } 

但是,如果我改成這樣,控制器被調用,一切似乎很好地工作:

public ErrorController() 
    { 
     _errorRepository = new ErrorRepository(); 
    } 

但是,最後一個例子不是最糟糕的做法,因爲ErrorController仍然與ErrorRepository緊密相連?

更新2:

我做了這個自定義控制器工廠:

public class ControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     try 
     { 
      if (controllerType == null) 
      { 
       throw new ArgumentNullException("controllerType"); 
      } 
      if (!typeof (IController).IsAssignableFrom(controllerType)) 
      { 
       throw new ArgumentException(string.Format("Type requested is not a controller: {0}", controllerType.Name), "controllerType"); 
      } 
      return MvcUnityContainer.Container.Resolve(controllerType) as IController; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

public static class MvcUnityContainer 
{ 
    public static UnityContainer Container { get; set; } 
} 

而這個引導程序類來設置所有的依賴:

public class Bootstrapper 
{ 
    public static IUnityContainer Initialise() 
    { 
     var container = BuildUnityContainer(); 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     return container; 
    } 

    private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IErrorRepository, ErrorRepository>(); 
     MvcUnityContainer.Container = container; 

     return container; 
    } 
} 

然後我在全局初始化。 asax文件:

 // Initialise IoC container 
     Bootstrapper.Initialise(); 
     // Register custom controller factory 
     ControllerBuilder.Current.SetControllerFactory(typeof(ControllerFactory)); 

現在我可以用構造函數注入,從而從我ErrorRepository脫鉤我ErrorController:

public ErrorController(IErrorRepository errorRepository) 
    { 
     this.errorRepository = errorRepository; 
    } 
+2

你有沒有注入IErrorController的某種IoC?這很可能未能觸及控制器,因爲您沒有空的構造函數,並且可能沒有DI設置。 – Johan

+0

你使用IoC來注入IErrorRepository嗎?它是如何創建的? – Ric

+1

「控制器永遠不會被調用」是什麼意思?你有什麼要求,你會得到什麼迴應? – CodeCaster

回答

0

好吧,我已經成功通過this優秀的職位上如何做一個IoC和團結閱讀來解決它。我用最終的代碼更新了OP。

0

根據我的經驗,Ninject是一個不錯的IoC容器。您可以從here下載並運行我的ASP.NET MVC項目。我已經使用從低級到高級的依賴注入。希望這會給你一個關於Ninject框架和爲什麼我們維護依賴倒置原理的想法

+0

你的意思是依賴注入原理還是控制原理倒置? lol – samneric

+0

它是依賴倒置原理。它由控制反轉完成。依賴注入是反轉控制的一種方式,因此我們維護依存反轉原理。 :) –