【问题标题】:Unity mvc4 and webapi same applicationunity mvc4 和 webapi 同一个应用
【发布时间】:2012-07-19 09:22:48
【问题描述】:

您好,我的环境是 MVC4RC wepapi 和 microsoft.practices.unity v2.0

我想在 mvc 控制器(继承自 System.web.mvc.Controller)和 webapi 控制器(继承自 System.web.http.ApiController)中使用 IoC/DI。问题是我无法同时上班,如果有人可以帮助我,我会粘贴一些代码。

在 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(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,但没有运气

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

任何帮助感谢 Tx。

【问题讨论】:

标签: asp.net-mvc inversion-of-control unity-container asp.net-web-api


【解决方案1】:

不是 Unity 特定的,但请查看 Haack 先生在标题下的解决方案:两个 DependencyResolvers @ http://haacked.com/archive/2012/03/11/itrsquos-the-little-things-about-asp-net-mvc-4.aspx

【讨论】:

  • 感谢我标记解决方案,因为来自 Tx3 的评论对解决方案产生了影响。
【解决方案2】:

根据 Tx3 注释

没有针对 webapi 的 DependencyResolver 实现,所以你需要它。

nuget Unity.WebAPI 已经得到它,但“不幸的是”您需要安装(无法再次工作)nuget Unity.Mvc3(与 MVC4Rc 配合得很好)

所有进程在:mvc4 webapi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2012-06-12
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多