簡體   English   中英

MEF-沒有為此對象定義無參數構造函數,等等

[英]MEF - No parameterless constructor defined for this object, et al

我是MEF的新手,並且陷入了“為此對象定義無參數構造函數”的困境。 在過去的幾個小時中,我查看了很多帖子,等等,結果完全被卡住了。 我究竟做錯了什么? 我正在使用 。 NET 4.5 ,那么我仍然需要所有這些屬性嗎? 我是否將舊式MEF與新式混合?

更新:

我正在研究的解決方案還引用了Unity 3.3,因此我認為它們可能會相互促進。 我需要刪除Unity嗎?

    [Export]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class HomeController : Controller
    {
        private readonly IHomeService _service;

        [ImportingConstructor]
        public HomeController(IHomeService service)
        {
            _service = service;
        }
    }

    [Export(typeof(IHomeService))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class HomeService : IHomeService
    {
        private readonly IServiceSearch _serviceSearch;

        [ImportingConstructor]
        public HomeService(IServiceSearch serviceSearch)
        {
            _serviceSearch = serviceSearch;
        }
    }

    [InheritedExport]
    public interface IHomeService
    {
       // ...
    }

    [Export(typeof(IServiceSearch))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class ServiceSearch : DataHub.Search, IServiceSearch
    {

        [ImportingConstructor]
        public ServiceSearch(IMapper<xxx, xxxDTO> x)
        {
           // ...
        }

    [InheritedExport]
    public interface IMapper<TDomain,TDto>
    {
        TDomain ToDomain(object o);
        void Initialize();
        TDto DomainToDto(TDomain domain);
    }

 [Export(typeof(IMapper<Account, AccountDTO>))]
    public class AccountMapper : IMapper<Account, AccountDTO>
    {
     //....
    }

    protected void Application_OnStart()
    {            
        var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        var composition = new CompositionContainer(catalog);
        IControllerFactory mefControllerFactory = new MefControllerFactory(composition); //Get Factory to be used
        ControllerBuilder.Current.SetControllerFactory(mefControllerFactory);
    }

    public class MefControllerFactory : DefaultControllerFactory
    {
        private readonly CompositionContainer _container;
        public MefControllerFactory(CompositionContainer container)
        {
            _container = container;
        }
        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            Lazy<object, object> export = _container.GetExports(controllerType, null, null).FirstOrDefault();

            return null == export
                                ? base.GetControllerInstance(requestContext, controllerType)
                                : (IController)export.Value;
        }
        public override void ReleaseController(IController controller)
        {
            ((IDisposable)controller).Dispose();
        }
    }

我設法使您的代碼可以進行以下修改:

  1. 將嵌套在ServiceSearch內的類型ServiceSearch外部。 我認為MEF不支持嵌套類型。 (看起來這只是上面代碼示例中的錯字。我認為這不是故意的。)

  2. IMapper<,>刪除InheritedExportAttribute 無論如何,您都可以在AccountMapper上進行顯式導出。 如果不進行此更改,最終將AccountMapper導出兩次。 由於MEF不知道要使用兩個匹配的導出中的哪個,因此導入到ServiceSearch的構造函數中會失敗。 或者,保留InheritedExportAttribute並刪除顯式導出。

  3. 或者刪除InheritedExportAttributeIHomeServiceExportAttributeHomeService ,為與上述相同的理由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM