0

我的来源在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();
        });
4

1 回答 1

0

这个问题实际上是一个配置问题。问题是 app.settings 连接字符串设置返回 null,我不确定为什么会发生这种情况,但我硬编码连接字符串只是为了笑。稍后会解决这个问题。

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

解决了这个问题后,结构映射似乎试图自行解决,所以我不得不添加一个命名空间排除项。

完成的代码如下所示:

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();
        });
    }
}
于 2013-03-27T18:00:30.323 回答