Có ai đã thành công khi sử dụng vùng chứa IoC để đưa các phụ thuộc vào bộ điều khiển ASP.NET WebAPI không? Tôi dường như không thể làm cho nó hoạt động.
Đây là những gì tôi đang làm bây giờ.
Trong của tôi 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;
}
Nhà máy sản xuất bộ điều khiển của tôi:
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);
}
}
Dường như không bao giờ tìm kiếm trong tệp thống nhất của tôi để giải quyết các phụ thuộc và tôi gặp lỗi như:
Đã xảy ra lỗi khi cố gắng tạo bộ điều khiển loại 'PersonalShopper.Services.WebApi.Controllers.ShoppingListController'. Đảm bảo rằng bộ điều khiển có một hàm tạo công khai không tham số.
tại System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpControllerContext controllerContext, Type controllerType) tại System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance (HttpControllerContext controllerContext, Type controllerType) tại System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance (HttpControllerControllerContext controller AtContext.llerWreatepaultControllerContext controller. (HttpControllerContext controllerContext, String controllerName) tại System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (HttpRequestMessage request, Can HủyToken hủyToken) tại System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (yêu cầu HttpRequestMessage, Can Hủy
Bộ điều khiển trông giống như:
public class ShoppingListController : System.Web.Http.ApiController
{
private Repositories.IProductListRepository _ProductListRepository;
public ShoppingListController(Repositories.IUserRepository userRepository,
Repositories.IProductListRepository productListRepository)
{
_ProductListRepository = productListRepository;
}
}
Tệp thống nhất của tôi trông giống như:
<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>
Lưu ý rằng tôi không có đăng ký cho chính bộ điều khiển vì trong các phiên bản trước của mvc, nhà máy sản xuất bộ điều khiển sẽ tìm ra rằng các phụ thuộc cần được giải quyết.
Có vẻ như nhà máy điều khiển của tôi không bao giờ được gọi.
GlobalConfiguration.Configuration.ServiceResolver.SetResolver()
như thế nào?