有沒有人使用IoC容器向ASP.NET WebAPI控制器注入依賴關係的任何成功?我似乎無法得到它的工作。使用Unity無法注入ASP.NET Web API控制器的依賴關係
這就是我現在要做的。
在我global.ascx.cs
:
public static void RegisterRoutes(RouteCollection routes)
{
// code intentionally omitted
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
IUnityContainer container = BuildUnityContainer();
System.Web.Http.GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
t =>
{
try
{
return container.Resolve(t);
}
catch (ResolutionFailedException)
{
return null;
}
},
t =>
{
try
{
return container.ResolveAll(t);
}
catch (ResolutionFailedException)
{
return new System.Collections.Generic.List<object>();
}
});
System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
BundleTable.Bundles.RegisterTemplateBundles();
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer().LoadConfiguration();
return container;
}
我的控制器廠:
public class UnityControllerFactory : DefaultControllerFactory
{
private IUnityContainer _container;
public UnityControllerFactory(IUnityContainer container)
{
_container = container;
}
public override IController CreateController(System.Web.Routing.RequestContext requestContext,
string controllerName)
{
Type controllerType = base.GetControllerType(requestContext, controllerName);
return (IController)_container.Resolve(controllerType);
}
}
它似乎永遠都看在我的統一文件來解決依賴關係,我也得到出現如下錯誤:
嘗試創建類型爲 'PersonalShopper.Services.WebApi.Controllers.ShoppingListController'的控制器時發生錯誤。 確保控制器有一個無參數的公共構造函數。
在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpControllerContext controllerContext,類型controllerType) 在System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance(HttpControllerContext controllerContext,HttpControllerDescriptor controllerDescriptor) 在系統。 Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateController(HttpControllerContext controllerContext,字符串controllerName) 在System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage 請求,的CancellationToken的CancellationToken) 在System.Web.Ht tp.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage 請求的CancellationToken的CancellationToken)
控制器的樣子:
public class ShoppingListController : System.Web.Http.ApiController
{
private Repositories.IProductListRepository _ProductListRepository;
public ShoppingListController(Repositories.IUserRepository userRepository,
Repositories.IProductListRepository productListRepository)
{
_ProductListRepository = productListRepository;
}
}
我的統一文件看起來像:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<register type="PersonalShopper.Repositories.IProductListRepository, PersonalShopper.Repositories" mapTo="PersonalShopper.Implementations.MongoRepositories.ProductListRepository, PersonalShopper.Implementations" />
</container>
</unity>
注我沒有控制器本身的註冊在先前版本的mvc中,控制器工廠會發現需要解決的依賴關係。
這似乎是我的控制器工廠從未被稱爲。
你是如何爲'GlobalConfiguration.Configuration.ServiceResolver.SetResolver()'實現lamda的? – jrummell 2012-03-14 13:15:07
該代碼在原始問題中。 – 2012-03-14 22:52:22
是的,它當然是。我沒有閱讀。 – jrummell 2012-03-15 13:01:28