.net简单注射器。注册webApiControllers没有无参数的公共构造函数

时间:2016-12-28 13:47:50

标签: c# .net asp.net-web-api dependency-injection simple-injector

我尝试调用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的调用 - 没有。我怎么解决它?感谢。

2 个答案:

答案 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])

希望有所帮助