2015-08-30 30 views
0

我在爲Web API 2.2中的模型設置依賴注入時遇到問題。具體來說,我目前正在執行此操作的方式會導致任何「InstancePerLifetimeScope」依賴項表現爲「SingleInstance」依賴項。Web API模型中的Autofac InstancePerLifetimeScope

這裏就是我目前與我JSON.NET解析器做:

public class AutofacContractResolver : DefaultContractResolver 
{ 
    private readonly IContainer _container; 

    public AutofacContractResolver(IContainer container) 
    { 
     _container = container; 
    } 

    protected override JsonObjectContract CreateObjectContract(Type objectType) 
    { 
     JsonObjectContract contract = base.CreateObjectContract(objectType); 

     if (_container.IsRegistered(objectType)) 
      contract.DefaultCreator =() => _container.Resolve(objectType); 

     return contract; 
    } 
} 

發生了什麼事是_container.Resolve(objectType)解決同一個實例爲每個請求。這泄露了破壞,因爲我現在有兩個不同的會話運行服務,其中一個已經過時。

我認爲Resolve調用發生在創建請求範圍之前。這將解釋上述行爲,但我不知道如何解決這個問題。

+0

你可以顯示代碼在哪裏設置合約解析程序,以便它被使用? –

回答

0

考慮使用ILifetimeScope而不是IContainer。

public class AutofacContractResolver : DefaultContractResolver 
{ 
    private readonly ILifetimeScope _container; 

    public AutofacContractResolver(ILifetimeScope container) 
    { 
     _container = container; 
    } 

    protected override JsonObjectContract CreateObjectContract(Type objectType) 
    { 
     JsonObjectContract contract = base.CreateObjectContract(objectType); 

     if (_container.IsRegistered(objectType)) 
      contract.DefaultCreator =() => _container.Resolve(objectType); 

     return contract; 
    } 
} 
+0

不幸的是,這種行爲與ILifetimeScope相同。但是我注意到ILifetimeScope標籤是「根」 - 這是進一步證明ContractResolver在Autofac的請求範圍之外運行。 –