我使用https://github.com/huyrua/efprs中的GenericRepository模式。我只想选择带有DbContext作为参数的构造函数。我知道有重复的问题,但this的解决方案并没有解决。这是我的配置:
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.AssemblyContainingType<Data.Entity.TokoContainer>();
scan.WithDefaultConventions();
});
x.For<DbContext>().Use<Data.Entity.TokoContainer>();
x.For<Infrastructure.Data.IRepository>()
.Use<Infrastructure.Data.GenericRepository>()
.Ctor<DbContext>().Is(c => c.GetInstance<DbContext>());
});
这会导致错误&#34; StructureMap异常代码:对于具体类型Infrastructure.Data.GenericRepository&#34;没有类型System.Data.Entity.DbContext类型的参数。
使用时:
x.SelectConstructor<Infrastructure.Data.IRepository>(() => new Infrastructure.Data.GenericRepository((DbContext)null));
x.ForConcreteType<Infrastructure.Data.IRepository>()
.Configure.Ctor<DbContext>().Is(c => c.GetInstance<DbContext>());
导致&#34; StructureMap配置失败:错误104&#34;。
从第一个代码中指定,添加参数名称&#34; context&#34;像这样:
x.For<Infrastructure.Data.IRepository>()
.Use<Infrastructure.Data.GenericRepository>()
.Ctor<DbContext>("context").Is(c => c.GetInstance<DbContext>());
导致错误&#34;缺少请求的实例属性&#34; connectionStringName&#34;对于InstanceKey xxx&#34;。我现在不知道该怎么做。
任何解决方案都将受到赞赏。
答案 0 :(得分:0)
StructureMap
试图通过字符串参数“connectionStringName”表示DbContext
具有构造函数。正如您在附加链接的测试方案中所看到的那样:MyDbContext.cs
public class MyDbContext : DbContext
{
...
public MyDbContext(string connStringName) :
base(connStringName)
{
...
因此,我们需要做的是正确映射DbContext
的构造函数。例如:
x.For<DbContext>()
.Use<Data.Entity.TokoContainer>()
// example, taking the first conn string - adjust as needed
.Ctor<string>().Is(ConfigurationManager.ConnectionStrings[0].ConnectionString);
;
现在,即使DbContext也会正确设置