StructureMap在GenericRepository上选择多个构造函数

时间:2013-05-25 02:40:50

标签: c# entity-framework repository-pattern structuremap

我使用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;。我现在不知道该怎么做。

任何解决方案都将受到赞赏。

1 个答案:

答案 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也会正确设置