2015-06-30 49 views
1

我對此持堅持態度,我想知道處理此問題的最佳方法是什麼。我有一個WebApi控制器,我想要注入ICommand實例,但是在檢查Post請求數據後,我可以知道我需要什麼實例。我將給出一個更清晰的例子,但我的問題也適用於接收事件參數的Winform事件,並根據此事件arg您希望注入不同的實現。統一注入WebAPI動作內的一個實例

public class TestController : ApiController 
{ 
    public object Post(int id) 
    { 
     ICommand command = null; 

     if(id = 1) 
     { 
      command = new Id1Command(); 
     } 
     else 
     { 
      command = new Id2Command(); 
     } 

     return new object(); 
    } 
} 

我能想到的唯一的事情是創建一個工廠,接受統一的容器作爲參數,該工廠調用container.Resolve與命名實例中。

我的問題是,我被教導你不應該註冊或解決你的作文根之外,這是違反良好做法(根據馬克西曼)。我一直在尋找這個問題的最佳設計。

回答

0

我會用的CommandFactory並把它傳遞到的TestController:

public class TestController : ApiController 
{ 
    private readonly ICommandFactory mCommandFactory; 

    public TestController(ICommandFactory CommandFactory) 
    { 
     mCommandFactory = CommandFactory; 
    } 

    public object Post(int id) 
    { 
     ICommand command = null; 

     if(id = 1) 
     { 
      command = CommandFactory.CreateId1Command(); 
     } 
     else 
     { 
      command = CommandFactory.CreateId2Command(); 
     } 

     return new object(); 
    } 
} 

現在你必須確保團結就是創造的TestController。爲此,您必須實現,配置和設置IDependencyResolver。檢查Dependency Injection in ASP.NET Web API 2

編輯您的評論:

對於這種情況,你可以使用仿函數接受一個int使用autofactory:

public class TestController : ApiController 
{ 
    private readonly Func<int, ICommand> mCommandFactory 

    public TestController(Func<int, ICommand> CommandFactory) 
    { 
     mCommandFactory = CommandFactory; 
    } 

    public object Post(int id) 
    { 
     var command mCommandFactory(id); 

     return new object(); 
    } 
} 

登記應該是這樣的:

container.RegisterType<Func<int, ICommand>>(new InjectionFactory(
    c => new Func<int, ICommand>(
       id => 
       { 
        if (id == 1) 
        { 
         return new Command(); 
        } 
        else 
        { 
         return new Command2(); 
        } 
       }))); 

注意:您仍然必須設置DependencyResolver!

+0

因此,我會在工廠中移動命令實例的創建,但我認爲這還不夠好,因爲我仍然必須在工廠內使用「新的Id1Command」,並且實例不會由容器管理。我正在尋找類似container.Resolve (id)的東西,但我不想在工廠中使用container.Resolve,因爲我認爲在組合根之外使用它是錯誤的。我對嗎? – ekalchev

+0

我更新了我的文章 –

+0

謝謝您的回答。我也發現這是解決這個問題的最優雅的方式,但不幸的是你需要第三方擴展https://outlawtrail.wordpress.com/2012/07/27/auto-generated-factories-with-unity/ – ekalchev

相關問題