2011-09-09 34 views
4

我是MEF的新手,我真的很混淆!有很多有用的文章和整洁的问题和答案在这里在stackoverflow。我下载了@ matthew-abbott在他的blog上载的例子,但我不知道如何添加新的插件或扩展来扩展主要的Web应用程序,我的意思就像你可以看到hereMVC 3和MEF并将插件添加到主应用程序

编辑: 此外,我使用实体框架,代码优先方法和工作单元为我的数据访问层应用程序,如果我的插件需要数据访问和(我的意思是插件有自己的模型)想要使用我创建的DAL?正如你知道每次模型改变,DbContext抛出和错误,并告诉重新创建数据库,有没有任何方式或其他ORM接受动态扩展DAL?

回答

5

该特定示例说明了我们如何将MEF与MVC3的新DependencyResolver相集成,这为MVC体系结构中的各种扩展点提供了服务位置机制。有我的博客上其他一些文章里面详细了解如何可能的插件架构可以工作的详细信息,这些都可以在:

  1. Modular ASP.NET MVC using the Managed Extensibility Framework (MEF), Part One
  2. Modular ASP.NET MVC using the Managed Extensibility Framework (MEF), Part Two
  3. Modular ASP.NET MVC using the Managed Extensibility Framework (MEF), Part Three

有也是一系列奇妙的文章,我的建议也应该是:

  1. ASP.NET MVC and the Managed Extensibility Framework (MEF)由马腾Balliauw
  2. Defining Web-scoped parts with MEF由蒂姆·罗伯茨

MVC是一个非常灵活的架构,有无数种方法可以延长,但因为ASP.NET应用程序在IIS中运行方式的本质,您需要非常小心地考虑零件的使用寿命。例如,控制器只能用于一个请求,因此您可能需要确保您的控制器具有特定的CreationPolicy。蒂姆罗伯特关于Web范围部分的文章是一篇特别好的文章。

希望这足以让你指向正确的方向。

编辑:由于MEF提供的模块化特性,重要的是要确保不同的图层是分离的。您已经指定您正在使用实体框架,但实际情况是,EF应该只能用于您的数据层。 MVC架构通常会在域模型上推广视图模型。为此,使用类似于存储库模式的东西来定义,例如,这里是一个模拟UserRepository

[Export(typeof(IUserRepository))] 
public class UserRepository : IUserRepository 
{ 
    public IEnumerable<UserViewModel> GetUsers() 
    { 
    // Get values here from EF as domain models 
    // And return them as view models? 
    } 
} 

,我们可以导出并注入到控制器:

[ExportController("User"), PartCreationPolicy(CreationPolicy.NonShared)] 
public class UserController : Controller 
{ 
    private readonly IUserRepository _repo; 

    [ImportingConstructor] 
    public UserController(IUserRepository repo) 
    { 
    if (repo == null) 
     throw new ArgumentNullException("repo"); 

    _repo = repo; 
    } 

    public ActionResult Index() 
    { 
    var users = _repo.GetUsers(); 
    return View(users); 
    } 
} 

这只是一个非常简单的例子,但像许多IoC容器,MEF还支持依赖注入。只要零件提供了合适的输出,就可以在合成时将其导入(通过属性注入或构造函数注入)到另一个零件中。

我的建议是反对将EF暴露给你的观点,因为这使得他们明确依赖它。通过谨慎分离并只在适当的层次上展示正确的类型,您的体系结构将变得更加健壮,灵活并且可测试,这使得维护和更新变得更加容易。作为另一个简单的例子,这里是我们如何可以测试我们的控制器:

[Test] 
public void UserController_CreatesViewResult_WithListOfUsers() 
{ 
    var mock = new Mock<IUserRepository>(); 
    mock.Setup(m => m.GetUsers()).Returns(new[] { new UserViewModel { Name = "Matt" } }); 

    var controller = new UserController(mock.Object); 

    var result = controller.Index(); 

    Assert.That(result is ViewResult); 
    // Other assertions. 
} 

因为我还没有紧耦合EF我的看法,我的控制器是一个很大的可测试的,我可以模拟一个合适的存储库和测试,其中我需要。

重要的是规划你的架构。

+0

谢谢终于我能以某种方式与您联系,我编辑了我的问题,请您重新查看它吗? –

+0

@persion Dev - 查看更新 –

+0

真正的描述性答案,但为了更清楚地阐述它,我会说,如果您提到的新用户插件(例如User)需要它自己的表,该怎么办?我的意思是模型更改和db-recreation的问题仍然存在,不是吗? –

相关问题