【问题标题】:NPoco StructureMap.MVC4 Constructor InjectionNPoco StructureMap.MVC4 构造函数注入
【发布时间】:2013-03-07 01:51:59
【问题描述】:

我有一个使用 StructureMap.MVC4 的 MVC4 应用程序。这是 IoC.cs 的片段

ObjectFactory.Initialize(x =>{
x.Scan(scan =>{
    scan.TheCallingAssembly();
    scan.WithDefaultConventions();});

x.For<IDbContext>().Use<EfDbContext>().Ctor<string>("connectionStringName").Is("DefaultDb");
x.For<IDatabase>().Use<Database>().Ctor<string>("connectionStringName").Is("DefaultDb");

x.For<IActionInvoker>().Use<InjectingActionInvoker>();
x.SetAllProperties(c=>c.OfType<IDbContext>());
... ...

DbContext 注入工作正常,ActionFilters 的 setter 注入以及所有使用默认约定的 Service:IService 也可以。但是我在尝试注入 IDatabase 时遇到以下错误:

Could not find a constructor parameter or property for NPoco.Database, NPoco, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null named connectionStringName Parameter name: name

如果我把它改成

x.For<IDatabase>().Use(new Database("DefaultDb"));

它有效。任何想法为什么?我想知道通过使用 New 是否会产生不同的 IDatabase 实例,尤其是在与 IDbContext 实例混合时。谢谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 structuremap npoco


    【解决方案1】:

    似乎与StructureMap相关的构造函数在存在多个具有相似构造函数参数的情况下无法确定默认构造函数。在这种情况下,它有

    Database(string connectionStringName)
    Database(string connectionStringName, string Provider)
    ....
    

    看起来这是稍微好一点的语法?

    x.For<IDatabase>().Use(() => new Database("DefaultDb"));
    

    【讨论】:

    • 我的 IDbContext 有一个带有 connectionStringName 的构造函数和一个带有 IDbConnection 的构造函数,并且工作正常。似乎 IDatabase 有太多重载的构造函数。
    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2016-06-01
    相关资源
    最近更新 更多