2

我有WebForms項目,在那裏我有WebApi控制器。 如何注入控制器構造函數和動作過濾器構造函數?統一注入到asp.net web api控制器和過濾器

我已經實現IDependencyResolverGlobal.asaxGlobalConfiguration.Configuration.DependencyResolver)使用它,但它並不能幫助: 請求控制器上說,沒有默認的構造函數和過濾器在應用程序啓動說,它不包含一個構造函數0個參數。

此外,我需要singletone注入行動過濾器。

謝謝。

UPD

public class ScopeContainer : IDependencyScope 
{ 
    protected readonly IUnityContainer _container; 

    public ScopeContainer(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>(); 
    } 

    public void Dispose() 
    { 
     _container.Dispose(); 
    } 
} 

public class IoCContainer : ScopeContainer, IDependencyResolver 
{ 
    public IoCContainer(IUnityContainer container) : base(container) 
    { 
    } 

    public IDependencyScope BeginScope() 
    { 
     var child = _container.CreateChildContainer(); 

     return new ScopeContainer(child); 
    } 
} 

public class Global : HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(); 
     ConfigureApi(GlobalConfiguration.Configuration); 
    } 

    void ConfigureApi(HttpConfiguration config) 
    { 
     var unity = new UnityContainer(); 

     unity.RegisterInstance<ILogger>(new Logger()); 
     unity.RegisterType<IRepository, DbRepository>(); 

     config.DependencyResolver = new IoCContainer(unity); 
    } 

    private static void RegisterRoutes() 
    { 
     RouteTable.Routes.MapHttpRoute("ServiceApi", "api/{controller}/{action}"); 
    } 
} 

+1

顯示您的IDependencyResolver的實現。你如何在Unity容器中註冊類型?這裏有一個鏈接如何在WebApi中使用IDependencyResolve http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver – Jehof

+0

是的,我閱讀這篇文章並使用它 – Boo

回答

2

我想這可能是你註冊你的路由方式。

WebApi路由通過GlobalConfiguration.Routes註冊到默認項目示例中,而不是由MVC控制器使用的RouteTable.Routes註冊。如果ApiController被MVC路由方法錯誤加載,它將無法找到您的依賴關係解析器。

嘗試修改您的代碼如下:

public class Global : HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(GlobalConfiguration.Configuration); 
     ConfigureApi(GlobalConfiguration.Configuration); 
    } 

    void ConfigureApi(HttpConfiguration config) 
    { 
     var unity = new UnityContainer(); 

     unity.RegisterInstance<ILogger>(new Logger()); 
     unity.RegisterType<IRepository, DbRepository>(); 

     config.DependencyResolver = new IoCContainer(unity); 
    } 

    private static void RegisterRoutes(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute("ServiceApi", "api/{controller}/{action}"); 
    } 

} 
0

我有同樣的問題,我在做一個項目,試圖幫助通過頁面轉換頁面的Web API現代化改造舊的Web窗體項目/角並且讓管道恰到好處地使用Unity是關鍵。

當我追蹤我注意到團結試圖解決控制器類,但不是要注入到他們的構造函數的類型,所以我註冊了我的控制器,它都工作。見我下面的例子

配置設置,註冊控制器和依賴

void ConfigureApi(HttpConfiguration config) 
{ 
     var container = UnitySingleton.UnityContainer; 
     container.RegisterType<IDashboardManager, ExampleStuff>(); 
     container.RegisterType<DashboardController>(new InjectionConstructor(container.Resolve<IDashboardManager>())); 
     config.DependencyResolver = new UnityIoCContainer(container); 
} 

而且我的控制器例如:

public class DashboardController : ApiController 
{ 
    private readonly IDashboardManager _dashboardManager; 

    public DashboardController(IDashboardManager dashboardManager) 
    { 
     _dashboardManager = dashboardManager; 
    } 

    public async Task<IEnumerable<string>> Get() 
    { 
     return await _dashboardManager.GetDatas(); 
    } 
} 

這是我得到了我的工作。這與上面的文章有點不同。