爲了讓自己更容易對我的應用程序進行單元測試,我試圖通過將我的數據訪問功能移動到單獨的存儲庫類中來實現存儲庫模式。在我的倉庫不調用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;
}
你有沒有注入IErrorController的某種IoC?這很可能未能觸及控制器,因爲您沒有空的構造函數,並且可能沒有DI設置。 – Johan
你使用IoC來注入IErrorRepository嗎?它是如何創建的? – Ric
「控制器永遠不會被調用」是什麼意思?你有什麼要求,你會得到什麼迴應? – CodeCaster