2014-07-23 77 views
2

我有以下的WebAPI控制器(我已經去除了大部分爲簡潔的代碼)Autofac的WebAPI通過屬性插入控制器依賴

public class ConnectionController : ApiController 
{ 
    /// <summary> 
    /// Gets or sets the connection manager. 
    /// </summary> 
    /// <value> 
    /// The connection manager. 
    /// </value> 
    public IConnectionManagerService ConnectionManager 
    { 
     get; 
     set; 

    } 

}

我試圖插入通過AutoFac的IConnectionManagerService這是我到目前爲止的代碼

// Create the container builder. 
var builder = new ContainerBuilder(); 

// Register the Web API controllers. 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

// Register other dependencies. 
builder.Register(c => new ConnectionManagerService()).As<IConnectionManagerService>().InstancePerRequest();      

// Build the container. 
var container = builder.Build(); 

// Create the depenedency resolver. 
var resolver = new AutofacWebApiDependencyResolver(container); 

// Configure Web API with the dependency resolver. 
GlobalConfiguration.Configuration.DependencyResolver = resolver; 

現在在控制器內部,當我嘗試使用ConnectionManager時,我得到null。我認爲Autofac會自動包含依賴項?我不想通過控制器中的構造函數參數來包含此依賴項。

+0

除了你不想這樣做外,還有沒有其他具體的原因讓你不用構造函數注入? – nemesv

+0

不是,我只是想盡可能地堅持標準,而不是修改以支持DI。 – user3547774

+1

使用構造函數注入被認爲是最佳實踐。不要誤導Visual Studio默認生成的代碼。默認的VS模板通常不會傳達最佳做法。 – Steven

回答

0

要在Autofac中實現注入屬性,您應該只使用PropertiesAutowired擴展方法。在行後您的autofac配置:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

插入線:

builder.RegisterType<ConnectionController>().PropertiesAutowired(); 

然後如果事情是在你的容器助洗劑IConnectionManagerService將被分配到的ConnectionManager屬性registerd。