2015-10-06 57 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

它是依赖倒置原理。它由控制反转完成。依赖注入是反转控制的一种方式,因此我们维护依存反转原理。 :) –