I am brand new to MEF and am stuck in "No parameterless constructor defined for this object" hell. I've looked at a lot of posts etc. over the last many hours and am totally stuck. What am I doing wrong? I'm using .NET 4.5
, so do I still need all these attributes? Am I mixing older style MEF
in with newer?
UPDATE:
The solution I'm working on also references Unity 3.3, so I think they may be stepping on each other. Do I need to remove 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();
}
}