[英]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();
}
}
我設法使您的代碼可以進行以下修改:
將嵌套在 ServiceSearch
內的類型ServiceSearch
外部。我認為MEF不支持嵌套類型。 (看起來這只是上面代碼示例中的錯字。我認為這不是故意的。)
從IMapper<,>
刪除InheritedExportAttribute
。 無論如何,您都可以在AccountMapper
上進行顯式導出。 如果不進行此更改,最終將AccountMapper
導出兩次。 由於MEF不知道要使用兩個匹配的導出中的哪個,因此導入到ServiceSearch
的構造函數中會失敗。 或者,保留InheritedExportAttribute
並刪除顯式導出。
或者刪除InheritedExportAttribute
上IHomeService
或ExportAttribute
上HomeService
,為與上述相同的理由。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.