Pregunta

I have an MVC4 application using StructureMap.MVC4. Here's a fragment of 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 injection works fine, so does the setter injection for ActionFilters, as well as all Service:IService using default convention. But I got the following error trying to inject 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

If I change it to

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

It works. Any ideas why? I wonder if by using New, it will end up a different instance of IDatabase, especially when mixing with the IDbContext instance. Thanks.

¿Fue útil?

Solución

Seems related to StructureMap can't decide the default constructor when there are multiples with similar constructor parameters. In this case, it has

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

Looks like this is slight better syntax?

x.For<IDatabase>().Use(() => new Database("DefaultDb"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top