从历史上看,我的控制器在每个控制器上都声明了通过StructureMap注入的存储库,这对我来说很好。
但我的新项目可能会为每个控制器使用相同的存储库。 由于这个原因,我创建了一个BaseController并从这里继承了所有控制器。 我的存储库现在位于Base,但注入不起作用。
它可以像这样工作,还是必须在每个控制器上进行构造函数注入?
public static void BootStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.Scan(scanner =>
{
scanner.TheCallingAssembly();
scanner.WithDefaultConventions();
scanner.AddAllTypesOf<IController>().NameBy(type => type.Name.Replace("Controller", "").ToLower());
});
x.For(typeof(IGenericRepository<>)).Use(typeof(GenericRepository<>));
});
}
工作:
public class TransactionController : Controller
{
public IGenericRepository<ITransaction> TransactionRepository { get; set; }
public TransactionController(IGenericRepository<ITransaction> transactionRepository)
{
this.TransactionRepository = transactionRepository;
}
public ActionResult Index()
{
var transactions = this.TransactionRepository.Query.AsEnumerable();
return View(transactions);
}
不工作:
public class BaseController : Controller
{
public IGenericRepository<ITransaction> TransactionRepository { get; set; }
public BaseController(IGenericRepository<ITransaction> transactionRepository)
{
this.TransactionRepository = transactionRepository;
}
protected BaseController()
{
}
}
public class TransactionController : BaseController
{
public ActionResult Index()
{
var transactions = base.TransactionRepository.Query.AsEnumerable();
return View(transactions);
}
}
答案 0 :(得分:3)
您必须以某种方式将您的存储库注入BaseController
。如果您的最后一段代码是您拥有的真实代码,则BaseController
似乎是通过受保护的无参数构造函数初始化的。
将构造函数添加到TransactionController
:
public TransactionController(IGenericRepository<ITransaction> transactionRepository) : base(transactionRepository)
{
}
答案 1 :(得分:0)
可以使用穷人的依赖注入 - 在NerdDinner应用程序中使用
public BaseController() : this(new Message())
{
}
或者 请参阅Phill的链接 tdd-and-dependency-injection-with-asp.net-mvc.aspx
Override DefaultControllerFactory
public class SMControllarFactory : DefaultControllerFactory
在
application start
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(new SMControllarFactory());