0

を登録していない私はタイプのコントローラを作成しようとすると、エラーが発生しまし.netシンプルなインジェクター。私は私のWEBAPIコントローラを呼び出すようにしようとしていた後webApiControllersノーパラメーターなしのパブリックコンストラクタ

、エラーが発生している「DrinkController」。コントローラにパラメータのないパブリックコンストラクタがあることを確認します。ここで

私Bootstrapper.cs私は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; 
    } 

コントローラーで彼を呼び出す方法

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; 
    } 
} 

とここにある - >

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

完全なスタックトレースを投稿してください。 – Steven

+0

また、Web APIアプリケーションでは、有効期間ライフスタイルとして「LifetimeScopeLifestyle」を使用することはできません。あなたの場合、 'WebRequestLifestyle'を使用してください。 – Steven

+0

@スティーブンありがとう、それはまさにその問題でした。 – ovasylenko

答えて

1

を助けるホープ内部の例外を調べます次の情報が表示されます。

オブジェクトは「ライフタイムスコープ」ライフスタイルとして登録されていますが、インスタンスはライフタイムスコープのコンテキスト外で要求されます。

これは、有効期間スコープを明示的に開始する必要があるためです。しかし、ライフタイムスコープは、両方のフレームワークの非同期動作のために、MVCとWeb APIの両方で動作するには不適切です。 IIS内部で実行しているので、デフォルトスコープのライフスタイルとしてWebRequestLifestyleを使用する必要があります。

0

私は多分、このやろう...問題は、あなたのユニティの設定ファイルであると思う:あなたは1つのコンストラクタが複数ある場合は、あなたのクラスの実装(のdafult空のコンストラクタを呼び出すには

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; 
    } 

を.. Unitytあなたが新しいInjectionConstructorを(使用することができます空のいずれかを選択したい場合は、よりparameter..soでいずれかを選択)、またはあなたのクラスのコンストラクタ飾り[InjectionConstructor]に入れて)

は、それが場合

+2

この質問はUnityに関するものではありません。シンプルインジェクターについてです – Steven

関連する問題