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 のセッター インジェクション、およびデフォルトの規則を使用するすべての 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 を使用すると、特に IDbContext インスタンスと混合する場合に、IDatabase の別のインスタンスになるのではないかと思います。ありがとう。

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 に答える