如何为mvc解耦app的structuremap指定正确的配置

时间:2012-07-19 06:44:42

标签: asp.net-mvc asp.net-mvc-3 entity-framework structuremap

我正在尝试将我的第一个mvc应用程序转换为一个分离的框架。

我有以下几层 MVC Web层,控制器层,域层,服务层,数据层和共享项目

我的测试工作正常,使用结构图和注入依赖项。 我的主要障碍是这个。

我正在使用oracle数据库,需要在运行时重新映射实体框架中包含的模式。我通过使用BrandonHayes适配器(我略微修改它)来完成这项工作。

对于我的服务层测试,我模拟了对象上下文,因此它不会针对真实数据库运行。

         private Mock<ICLObjectContext> _clmock = new Mock<ICLObjectContext>();

对于我的数据单元测试我做了类似的事情,这样我就可以测试我的测试数据库,并使用事务,我可以在测试后回滚。

        //This allows us to remap the schema
        Dictionary<string,string> mappingschemas = new Dictionary<string,string>();
        mappingschemas.Add("CLAPORTAL","CLAPORTALTEST");
        mappingschemas.Add("QCTL","QTEST");
         _context = new CLObjectContext(ec, mappingschemas);
         ObjectFactory.Inject(typeof(ICLObjectContext), _context);

这很有效。问题是当我尝试运行真实应用程序时。

我必须删除这个构造函数,只留下一个简单的0参数构造函数,以便Structuremap可以在运行时创建对象上下文,因此不能进行任何模式映射。

因为Web项目没有引用数据层,因此对ICLObjectContext一无所知,如何告诉structuremap,通过一些配置,我想创建一个新的字典,其中映射模式x到模式y,

服务层有一个对数据层的引用,所以我猜我需要在那里做,因为web项目可以引用服务层。

这会是对的吗?嗯,我刚刚陷入困境,无法找到出路。

由于

1 个答案:

答案 0 :(得分:0)

那么,在写出问题之后,再一次,它帮助我找到了解决方案。

我只是创建了一个名为ISchemaResolver的接口,并使其成为共享项目的一部分。

然后我把它放在我的entityadapter类的构造函数中。

在Web项目中,我刚刚创建了一个名为AppSettingsSchemaResolver的类,它使用应用程序设置来设置字典,然后通过global.asax传递它,当我连接我的依赖项时,即

              //Now also set up our schema mapping stuff.
  ObjectFactory.Configure(x => x.For<ISchemaResolver>().Add<AppSettingsSchemaResolver>());