0

大家好,我是环境MVC4RC wepapi和microsoft.practices.unity V2.0团结mvc4和的WebAPI相同的应用程序

我想用的IoC/DI在MVC控制器(从System.web.mvc.Controller继承)和webapi控制器(从System.web.http.ApiController继承)。问题是我不能同时工作,如果有人能帮助我,我会粘贴一些代码。

在的global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 

    private static IUnityContainer container; 

    protected void Application_Start() 
    { 
     .... 

     InitializeDependencyInjectionContainer(GlobalConfiguration.Configuration); 
    } 



    private static void InitializeDependencyInjectionContainer(HttpConfiguration config) 
    { 
     container = new UnityContainer(); 


     container.RegisterType<Site.Web.Data.IDatabaseFactory, Site.Web.Data.DatabaseFactory>(); 
     container.RegisterType<Site.Web.Data.Interfaces.IUnitOfWork, Site.Web.Data.UnitOfWork>(); 
     container.RegisterType<Site.Web.Data.Interfaces.IUserRepository, Site.Web.Data.Repositories.UserRepository>(); 
     container.RegisterType<Site.Web.Data.Interfaces.ISiteRepository, Site.Web.Data.Repositories.SiteRepository>(); 
     container.RegisterType<Site.Web.Data.Interfaces.IInformationRepository, Site.Web.Data.Repositories.InformationRepository>(); 

     container.RegisterType<IUserServices, UserServices>(); 
     container.RegisterType<ISiteServices, SiteServices>(); 
     container.RegisterType<IInformationServices, InformationServices>(); 
     container.RegisterType<IFormsAuthenticationService, FormsAuthenticationService>(); 
     container.RegisterType<IMembershipService, MembershipService>(); 
     //config.DependencyResolver = new Site.Web.IoC.IoCContainer(container); 
     DependencyResolver.SetResolver(new Site.Web.IoC.IoCContainer(container)); 
     //DependencyResolver.SetResolver(new Site.Web.IoC.UnityDependencyResolver(container)); 

    } 
} 

的IoC的解析器:

public class IoCContainer : System.Web.Mvc.IDependencyResolver 
{ 
    private readonly IUnityContainer container; 
    public IoCContainer(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return this.container.Resolve(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return this.container.ResolveAll(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return new List<object>(); 
     } 
    } 
} 

注:System.Web.Mvc.IDependencyResolver而不是System.Web.Http.Dependencies.IDependencyResolver

现在控制器都具有相同的结构,我使用常见的类来提供用户和站点信息(如codeplex/Silk的样式)

一个MVC的控制器:

public class SiteController : _AuthorizedController 
{ 

     ISiteServices _siteServices; 

    public SiteController(Site.Web.Domain.Services.IUserServices userServices, 
          Site.Web.Domain.Services.ISiteServices siteServices) 
     : base(userServices) 
    { 
     this._siteServices = siteServices; 
    } 

    .... 
} 

的_AuthorizedController是我使用的一个具有所需的所有用户和地点信息:

public class _AuthorizedController : Controller 
{ 

    protected readonly Site.Web.Domain.Services.IUserServices _userServices; 
    public _AuthorizedController(Site.Web.Domain.Services.IUserServices userServices) 
    { 
     if (userServices == null) throw new ArgumentNullException("userServices"); 
     this._userServices = userServices; 

    } 

    ... 
} 

和一个的WebAPI控制器:

public class InformationController : _AuthorizedApiController 
{ 

    private ISiteServices _siteServices; 
    private IUserServices _userServices; 

    public InformationController(Site.Web.Domain.Services.IUserServices userServices, 
          Site.Web.Domain.Services.ISiteServices siteServices) 
    : base(userServices) 
    { 
     this._siteServices = siteServices; 
     this._userServices = userServices; 
    } 

... }

和_AuthorizedApiController我创建preservethe继承链(ApiController):

public class _AuthorizedApiController : ApiController 
{ 

     protected readonly Site.Web.Domain.Services.IUserServices _userServices; 

     public _AuthorizedApiController(Site.Web.Domain.Services.IUserServices userServices) 
     { 
      if (userServices == null) throw new ArgumentNullException("userServices"); 
      this._userServices = userServices; 

     } 

    ..... 
} 

以及这种结构适用于MVC控制器,但我没能上apicontroller运行。我会尝试根据Using the Web Api dependency...但没有运气改变的IoC

我总是有非常expresive错误“Site.Web.webapi.InformationController”没有默认的构造函数

赞赏的Tx任何帮助。

+0

这可能是相关的吗? http://stackoverflow.com/questions/9527988/cannot-inject-dependencies-into-asp-net-mvc-4-web-api-controller-using-unity – Tx3 2012-07-20 06:04:01

回答

1

按照Tx3上标注

没有用于DependencyResolver没有实施的WebAPI,所以你需要它。

的NuGet Unity.WebAPI已完成了,但 “不幸” 您需要安装(不再工作)的NuGet Unity.Mvc3在(与MVC4Rc的伟大工程)

全过程:mvc4 webapi

相关问题