我正在构建一组非常简单的控制器,我想将依赖项注入其中 .
我的Web Api项目正在使用.net 4.5.1(vs2015),我正在使用Unity进行依赖注入(对于Unity来说真的很新) .
这就是我所做的:
-
新项目> ASP.Net网站应用> Web Api项目(无认证)
-
工具> Nuget包管理器>管理包的解决方案...搜索"Unity.MVC"并安装包 .
-
我创建了以下接口和类:
public interface IExample
{
void DoWork();
}
public class ServiceA : IExample
{
public void DoWork()
{
Console.Write("A");
}
}
public class ServiceB : IExample
{
public void DoWork()
{
Console.Write("B");
}
}
在我的简单控制器中,我实现了这个:
public class HomeController : Controller
{
IExample instance;
public HomeController(IExample injected)
{
instance = injected;
}
public ActionResult Index()
{
ViewBag.Title = "Home Page";
return View();
}
}
我有来自Unity的这两个新添加的文件:
我将以下代码添加到UnityConfig.cs:
public static void RegisterTypes(IUnityContainer container)
{
// NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
// container.LoadConfiguration();
// TODO: Register your types here
//container.RegisterType<IProductRepository, ProductRepository>();
container.RegisterType<IExample, ServiceA>();
}
到目前为止 - 一切都好!我按预期将DI放入视图中 . 现在我想为我的web api控制器做同样的事情,如下:
运行 - 并得到此错误:
尝试创建“ItemController”类型的控制器时发生错误 . 确保控制器具有无参数的公共构造函数 .
我做错了什么?完全例外:
{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'ItemController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Type 'WebApplication2.Controllers.ItemController' does not have a default constructor",
"ExceptionType": "System.ArgumentException",
"StackTrace": " at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
提前致谢!
2 回答
ControllerActivator
无法实例化HomeController
,因为它的构造函数未标记为public
(因此它实际上是private
) .当你根本不提供任何构造函数时,编译器会自动为你创建一个
public
,但由于你提供了一个(不是public
),你最终没有公共构造函数 .试试这个:
Update:
根据您的编辑,为了将Unity与API控制器集成,您还必须安装Unity.WebAPI包 .
有关WebAPI inegration的更多信息:http://www.asp.net/web-api/overview/advanced/dependency-injection
要在Web API中使用具有统一性的依赖注入,请使用以下步骤 .