Entity framework 向通用存储库的structuremap注册类型时出现问题

Entity framework 向通用存储库的structuremap注册类型时出现问题,entity-framework,entity-framework-5,repository-pattern,structuremap,Entity Framework,Entity Framework 5,Repository Pattern,Structuremap,我的消息来源是 我想创建一个可以在不同项目中引用的通用存储库。我见过的大多数通用存储库实现都使这一点变得困难。我无意中发现它对我的想法非常有用。我的每个项目都可以在其中定义一个上下文,然后我只需要引用一个通用存储库项目或dll并在上下文中传递,我就可以开始了 我唯一想弄清楚的是如何连接structuremap,因为有一些嵌套的依赖项需要解决。不幸的是,该博客并未真正讨论如何使用通用存储库实现依赖项注入。我试图对实现进行修补(请参见上面提到的git hub repo),但在配置结构图时,我做了一些

我的消息来源是

我想创建一个可以在不同项目中引用的通用存储库。我见过的大多数通用存储库实现都使这一点变得困难。我无意中发现它对我的想法非常有用。我的每个项目都可以在其中定义一个上下文,然后我只需要引用一个通用存储库项目或dll并在上下文中传递,我就可以开始了

我唯一想弄清楚的是如何连接structuremap,因为有一些嵌套的依赖项需要解决。不幸的是,该博客并未真正讨论如何使用通用存储库实现依赖项注入。我试图对实现进行修补(请参见上面提到的git hub repo),但在配置结构图时,我做了一些错误的事情

依赖项的工作方式如下所示: 存储库在构造函数中获取一个上下文,而上下文又获取一个连接字符串。构造函数参数是所有符合IType映射到类型的默认约定的接口。我的假设是,由于我有自动注册,我需要做的就是显式定义上下文的注册,告诉structuremap它应该从app.config获取连接字符串,我应该可以开始了

但是,structuremap无法像我想象的那样计算注册:

StructureMap Exception Code:  202
No Default Instance defined for PluginFamily Generic_Repository_Test.IGenericRepository`1
    [[ViewModel.Customer, ViewModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], 
    Generic Repository Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
注册码

        //This is commented out since it should not be necessary.
        //I tried to put this in for grins
        //and see if it would resolve the issue but it doesn't.
        //For<IGenericRepository<Customer>>().Use<GenericRepository<CustomerContext, Customer>>();

        For<ICustomerContext>()
                .Use<CustomerContext>()
                .Ctor<string>("connectionString")
                .EqualToAppSetting("ConnectionString");

        //I've tried moving scan to the top but it didn't make a difference
        Scan(x =>
        {
            x.AssembliesFromApplicationBaseDirectory();
            x.WithDefaultConventions();
        });
//这是注释掉的,因为它不应该是必需的。
//我试着把这个放在嘴边笑
//看看它是否能解决这个问题,但事实并非如此。
//For().Use();
For()
.Use()
.Ctor(“连接字符串”)
.EqualToAppSetting(“连接字符串”);
//我试着把扫描移到顶部,但没什么不同
扫描(x=>
{
x、 AssembliesFromApplicationBaseDirectory();
x、 使用默认约定();
});

事实证明,这个问题确实是一个配置问题。 问题是app.settings connectionstring设置返回null,我不确定为什么会出现这种情况,但我只是为了GRIN而硬编码了连接字符串。我们稍后会解决这个问题

解决了这个问题后,我仍然必须手动配置repo和上下文,因为出现了另一个错误

解决了这个问题后,structuremap似乎正在尝试自行解决问题,因此我不得不添加一个名称空间排除

完成的代码如下所示:

public class DependencyRegistry : Registry
{
    public DependencyRegistry()
    {
        For<ICustomerContext>()
                .Use<CustomerContext>()
                .Ctor<string>("connectionString")
            //.EqualToAppSetting("ConnectionString");
                .Is(@"Data Source=(localdb)\Projects;Initial Catalog=EventStorage;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False");
        For<IGenericRepository<Customer>>().Use<GenericRepository<ICustomerContext, Customer>>();


        Scan(x =>
        {
            x.AssembliesFromApplicationBaseDirectory();
            x.ExcludeNamespace("StructureMap");
            x.WithDefaultConventions();
        });
    }
}
公共类依赖项注册表:注册表
{
公共从属注册表()
{
For()
.Use()
.Ctor(“连接字符串”)
//.EqualToAppSetting(“连接字符串”);
.Is(@“数据源=(localdb)\Projects;初始目录=事件存储;集成安全性=True;连接超时=30;加密=False;信任服务器证书=False”);
For().Use();
扫描(x=>
{
x、 AssembliesFromApplicationBaseDirectory();
x、 ExcludeNamespace(“结构映射”);
x、 使用默认约定();
});
}
}

您的web/app.config中是否有名为“connectionString”的应用程序设置(在appSettings部分)?如果要从ConnectionString部分解析ConnectionString,必须使用某些内容。@PHeiberg该字符串不在ConnectionString节点中,因为structuremap指定了应用程序设置,所以我将其放在属性的设置区域。最后,我确实将connectionString移动到了它的专用区域,并使用configuration manager按名称提取了connectionString。