我的来源在https://github.com/tonyeung/generic-repo
我想创建一个可以在不同项目中引用的通用存储库。我见过的大多数通用存储库实现都使这变得困难。我偶然发现了http://blog.damianbrady.com.au/2012/07/24/a-generic-repository-and-unit-of-work-implementation-for-entity-framework/并发现它会很好用对于我的想法。我的每个项目都可以在其中定义一个上下文,然后我只需要引用一个通用存储库项目或 dll 并传入上下文,我就可以开始了。
我唯一想弄清楚的是如何连接结构图,因为有一些嵌套的依赖项需要解决。不幸的是,该博客并没有真正解决如何使用通用存储库实现依赖注入。我试图修改实现(参见上面引用的 git hub repo),但是在配置结构映射时我做错了。
依赖关系是这样工作的:存储库在构造函数中获取一个上下文,而上下文又获取一个连接字符串。构造函数参数都是符合 IType 映射到 Type 的默认约定的接口。我的假设是,因为我有自动注册,所以我需要做的就是明确定义上下文的注册,告诉结构映射它应该从 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();
});