こんにちは私の環境は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に感謝します。