1

我想在我的asp.net mvc 3应用程序中使用MEF,但我无法实现注入。下面是代码:使用mef与asp.net mvc 3

我有有一个接口类库:

namespace Namespace.Interfaces 
{ 
    public interface IMessenger 
    { 
     string GetMessage(); 
    } 
} 

而在另一个类库我有类从IMessenger的继承:

namespace Namespace.Message 
{ 
    [Export(typeof(IMessenger))] 
    public class Messenger : IMessenger 
    { 
     public Messenger() 
     { 

     } 

     public string GetMessage() 
     { 
      return "Mef Test!"; 
     } 
    } 
} 

我有一个“零件“目录在我的应用程序,我正在复制包含类名为”Messenger“的类库的dll。

在Global.asax中,我有:

private static CompositionContainer _container; 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     DirectoryCatalog catalog = new DirectoryCatalog(Server.MapPath("Plugins"), "*.dll"); 
     _container = new CompositionContainer(catalog); 
     _container.ComposeParts(); 

     DependencyResolver.SetResolver(new MefDependencySolver(_container)); 
    } 

这里是MefDependencyResolver类:

public class MefDependencySolver : IDependencyResolver 
{ 
    public MefDependencySolver(CompositionContainer compositionContainer) 
    { 
     this.compositionContainer = compositionContainer; 
    } 

    private CompositionContainer compositionContainer; 

    public object GetService(Type serviceType) 
    { 
     string name = AttributedModelServices.GetContractName(serviceType); 

     return compositionContainer.GetExportedValueOrDefault<object>(name); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return this.compositionContainer.GetExportedValues<object>(serviceType.FullName); 
    } 
} 

,最后我想在我的控制器那样使用它:

public class HomeController : Controller 
{ 
    [ImportAttribute] 
    public IMessenger _messenger { get; set; } 

    public HomeController() 
    { 

    } 

    public ActionResult Index() 
    { 
     ViewBag.Message = _messenger.GetMessage(); 

     return View(); 
    } 
} 

但它不创建_messenger对象。我没有将对象引用设置为对象的实例。我究竟做错了什么?

在此先感谢,所有的

+0

我需要帮助。没有线索? – anilca 2011-12-22 10:14:45

+0

为了简化MEF 2中的这种情况,我们已经做了很多工作 - 只有CodePlex版本目前可用,但是您可以给出的任何反馈都会很棒! http://blogs.msdn.com/b/bclteam/archive/2011/11/11/using-mef-2-with-asp-net-mvc-3.aspx – 2011-12-24 16:20:54

回答

1

首先,你应该重写你GetServices方法方式:

public IEnumerable<object> GetServices(Type type) 
    { 
     string name = AttributedModelServices.GetContractName(type); 

     try 
     { 
      return container.GetExportedValues<object>(name); 
     } 
     catch 
     { 
      return new object[] {}; 
     } 
    } 

最重要的是返回一个空列表,如果服务不能得到解决。

第二件事是赞成注入构造函数而不是属性。需要依赖关系IMessenger,因此最好由构造函数来请求它。您可以revrite这样说:

public HomeController : Controller 
{ 
    private readonly IMessenger _messenger; 

    [ImportingConstructor] 
    public HomeController(IMessenger messenger) 
    { 
     _messenger = messenger; 
    } 

    // other actions 
} 

我认为这个问题来源于此行_container.ComposeParts();。我认为你不应该这样称呼它。 MEF会为你做。

+0

感谢您的回答。在更改我的代码后,现在我为HomeController创建了一个“为该对象定义的无参数构造函数”异常。添加无参数的构造函数也无济于事。它坚持调用无参数构造函数,并抛出未设置为对象异常实例的对象引用。 – anilca 2011-12-22 12:03:31

+1

尝试在您的HomeController上放置[Export]属性。 MEF需要知道该类型是否可以构建。 – 2011-12-22 12:09:47

+0

同样的例外:“没有为此对象定义无参数构造函数” – anilca 2011-12-22 12:19:55