1

我正在使用来自https://github.com/huyrua/efprs的 GenericRepository 模式。我只想选择以 DbContext 作为参数的构造函数。我知道有重复的问题,但这个解决方案没有解决。这是我的配置:

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>());
});

这会导致错误“StructureMap 异常代码:具体类型 Infrastructure.Data.GenericRepository 没有 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>());

导致“StructureMap 配置失败:错误 104”。

从第一个代码中指定,添加参数名称“context”,如下所示:

x.For<Infrastructure.Data.IRepository>()
 .Use<Infrastructure.Data.GenericRepository>()
 .Ctor<DbContext>("context").Is(c => c.GetInstance<DbContext>());

导致错误“InstanceKey xxx 缺少请求的实例属性“connectionStringName””。我不知道现在该怎么办。

任何解决方案将不胜感激。

4

1 回答 1

0

StructureMap试图表达的是,DbContext具有字符串参数“connectionStringName”的构造函数。正如您在附加的链接的测试场景中看到的那样: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 也会正确设置

于 2013-05-25T04:46:27.953 回答