我尝试调用webApi控制器后出错,
尝试创建“DrinkController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。
这是我的Bootstrapper.cs
public class Bootstrapper
{
public Container Start(HttpConfiguration configuration)
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new LifetimeScopeLifestyle();
var conString = ConfigurationManager.ConnectionStrings["DrinksContext"].ConnectionString;
container.Register(() => new DrinksContext(conString), Lifestyle.Scoped);
container.Register<IUserManager, UserManager>();
container.Register<IDrinkManager, DrinkManager>();
container.Register<IOrderManager, OrderManager>();
container.Register<IUnitOfWork, UnitOfWork>();
container.RegisterWebApiControllers(configuration);
container.Verify();
return container;
}
}
以及我在Global.asax.cs中如何称呼他
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
var container = new Bootstrapper().Start(GlobalConfiguration.Configuration);
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
}
控制器 - &gt;
private readonly IOrderManager _orderManager;
private readonly IDrinkManager _drinkManager;
public DrinkController(IOrderManager orderManager, IDrinkManager drinkManager)
{
_orderManager = orderManager;
_drinkManager = drinkManager;
}
UnitiOfWork构造函数依赖于DrinksContext;
邮递员回复 - here
我正在向我的经理注入UnitOfWork。 DrinksContext应根据每个请求重新初始化。当行
container.RegisterWebApiControllers(configuration)
执行控制器构造函数触发,但只是来自Postman的调用 - 没有。我怎么解决它?感谢。
答案 0 :(得分:1)
如果查看抛出异常的内部异常,您将看到以下信息:
对象已注册为&#39;终身范围&#39;生活方式,但实例是在终身范围的背景下请求的。
这是因为需要显式启动生命周期范围。但是,由于两个框架的异步行为,生命周期范围不适合与MVC和Web API一起使用。由于您在IIS中运行,因此应使用WebRequestLifestyle
作为默认范围的生活方式。
答案 1 :(得分:0)
我认为问题出在您的Unity配置文件中..也许尝试这样做:
public Container Start(HttpConfiguration configuration)
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new LifetimeScopeLifestyle();
var conString = ConfigurationManager.ConnectionStrings["DrinksContext"].ConnectionString;
container.Register(() => new DrinksContext(conString), Lifestyle.Scoped);
container.Register<IUserManager, UserManager>();
container.Register<IDrinkManager, DrinkManager>(new InjectionConstructor());
container.Register<IOrderManager, OrderManager>(new InjectionConstructor());
container.Register<IUnitOfWork, UnitOfWork>();
container.RegisterWebApiControllers(configuration);
container.Verify();
return container;
}
调用类实现的dafult空构造函数(如果你有多个构造函数...... Unityt选择带有更多参数的那个..如果你想选择空的那个,你可以使用新的InjectionConstructor()或put在你的类的构造函数中装饰[InjectionConstructor])
希望有所帮助