2012-04-22 58 views
2

我在扩展基于MVC 3在类库与ASP.NET MVC 3

基本上是一个解决方案的过程中,该解决方案由一个MVC 3项目的一些类库项目一起使用MEF管理业务/数据访问。

我试图使用MEF来使应用程序插件为基础。例如,我在dll项目一UserManager类和我定义我的插件如下:

[ImportMany]public List<IUserHooks> Plugins {get; set;} 
foreach (var plugin in Plugins) 
{ 
    Plugin.DoTheJob(); 
} 

正如你所看到的,这个类是从MVC项目和控制器分离。该列表被定义为我的UserManager类。

我知道最好的办法是让UserManager使用MEF以及(可能在控制器的构造函数像public MainController(IUserManager UserManager)初始化),但因为我只是想添加插件支持的解决方案,而不是从头开始写,我喜欢最快的捷径。

我应该如何定义我的MEF container对象才能够在我的类库中使用它。是否有必要使用MEF来制作MVC应用程序?我更喜欢对MVC应用程序进行最小修改的方法。

回答

2

MVC3已经支持服务位置。如果您不想重新定义某些基类,但只想扩展,则可以添加使用MEF的IDependencyResolver的实例。这样你可以用它作为扩展应用程序的基础。我在my blog上写了一个例子。

使用MVC3的内置架构,您可以在启动时配置CompositionContainer,并将其展示给其余的基础架构。

但是,实际情况是,您可能不希望将您的容器暴露在您的库中。事实上,你应该做的唯一事情就是简单地标出你的出口。你可以用MEF逃脱这个原因是因为它包含在.NET 4.0的BCL中。通过不将你的类耦合到MEF(或者事实上,将你的类耦合到服务定位器或反转控制容器),它使你的代码更加便携,可测试和解耦。

+0

感谢您的回答马修。我试图测试您的解决方案,并添加了一个简单的导入和导出TestDll项目。但具有“导入”属性的属性始终为空。是否有任何额外的步骤,我应该能够使用您的框架作为基地,或者我应该能够引用我的dll与导入/导出并使用它们?你有什么想法我做错了吗?谢谢。 – Kamyar 2012-04-23 08:23:43