在使用StructureMap时,我可以拥有包含所有存储库的baseController吗?

时间:2011-02-26 19:05:29

标签: asp.net-mvc dependency-injection structuremap ioc-container

从历史上看,我的控制器在每个控制器上都声明了通过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);
    }

}

2 个答案:

答案 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());