Entity framework 向通用存储库的structuremap注册类型时出现问题
我的消息来源是 我想创建一个可以在不同项目中引用的通用存储库。我见过的大多数通用存储库实现都使这一点变得困难。我无意中发现它对我的想法非常有用。我的每个项目都可以在其中定义一个上下文,然后我只需要引用一个通用存储库项目或dll并在上下文中传递,我就可以开始了 我唯一想弄清楚的是如何连接structuremap,因为有一些嵌套的依赖项需要解决。不幸的是,该博客并未真正讨论如何使用通用存储库实现依赖项注入。我试图对实现进行修补(请参见上面提到的git hub repo),但在配置结构图时,我做了一些错误的事情 依赖项的工作方式如下所示: 存储库在构造函数中获取一个上下文,而上下文又获取一个连接字符串。构造函数参数是所有符合IType映射到类型的默认约定的接口。我的假设是,由于我有自动注册,我需要做的就是显式定义上下文的注册,告诉structuremap它应该从app.config获取连接字符串,我应该可以开始了 但是,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),但在配置结构图时,我做了一些
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。