0

こんにちは私の環境はMVC4RCwepapiとmicrosoft.practices.unityv2.0です

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.Http.Dependencies.IDependencyResolverではなくSystem.Web.Mvc.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;

    }

    ...
}

および1つの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で実行できませんでした。Web Apiの依存関係の使用に従ってIoCを変更しようとしますが、運がありません

私は常に非常に表現力豊かなエラーが発生します'Site.Web.webapi.InformationController'にはデフォルトのコンストラクターがありません

どんな助けでもTxに感謝します。

4

2 に答える 2

1

Tx3アノテーションによると

webapiのDependencyResolverの実装はないため、必要です。

nuget Unity.WebAPIはそれを持っていますが、「残念ながら」インストールする必要があります(再び機能しないようにするため)nuget Unity.Mvc3(MVC4Rcでうまく機能します)

すべてのプロセス:mvc4 webapi

于 2012-07-20T06:44:41.287 に答える
1

Unity固有ではありませんが、見出しの下にあるHaack氏のソリューションを確認してください:Two DependencyResolvers @ http://haacked.com/archive/2012/03/11/itrsquos-the-little-things-about-asp-net-mvc-4 .aspx

于 2012-07-20T14:47:24.043 に答える