2

我有一个使用 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 实例混合时。谢谢。

4

1 回答 1

0

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

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

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

x.For<IDatabase>().Use(() => new Database("DefaultDb"));
于 2013-03-19T00:34:32.660 回答