1

我有一個使用SS(Great framework !!)的項目。 它是一個Rest API。我在提供接口的相同解決方案中引用了其他項目(我在VS2012中執行此操作)。我也在實現此接口的同一解決方案中擁有第三個項目。讓我們把這些項目:ServiceStack IoC DI Design解決單獨項目中的問題

WebAPIInterfacesEngine

的WebAPI引用接口和引擎。引擎參考接口

一切都很好。

我在appHost(的WebAPI)中使用IOC來註冊引擎的接口,並且這也適用。

我的問題是我的引擎需要訪問Ormlite數據庫。我已經將ServiceStatck.OrmLight.Mysql引用添加到Engine,但引用在Engine構造函數中引用時爲空。

public Engine() 
    { 
     using (var db = DbConnectionFactory.OpenDbConnection()) 
     { 
      //do db operations 
     } 
    } 

我可以從Webapi訪問查找數據庫。我如何通知數據庫的引擎?我似乎在層之間失去了。

我希望這是明確的(考慮)。

+0

您有沒有機會看看[Web Api幫助頁面](http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-框架/使用的Web-API與實體的框架,-part-3)? –

+0

除非我錯過了一些東西 - 那不是我的問題。我的問題是,在我的Engine項目中,我無權訪問容器,因此無法訪問在webAPI的appHost中註冊的Registered DbConnectionFactor。 – Jeff

+0

我不太瞭解SS,但從您的問題看,您似乎試圖在使用IoC的WebApi項目和Engine項目之間創建週期性依賴關係。我認爲你最好將ormLite依賴關係移動到引擎上,並在WebApi配置中保留它的配置。 –

回答

0

如果您的AppHost(在WebAPI項目中)正在註冊並解析引擎/ IEngine實例,那麼您需要將IDbConnectionFactory注入到您的引擎實例中。

最好的方法是通過構造函數注入。

修改您的引擎類採取IDbConnectionFactory依賴:

public class Engine : IEngine 
{ 
    IDbConnectionFactory dbFactory = null; 

    public Engine(IDbConnectionFactory dbFactory) // IoC container injects dbFactory 
    { 
     this.dbFactory = dbFactory; 
    } 

    public void DoSomething() 
    { 
     using (var db = dbFactory.OpenDbConnection()) 
     { 
      //do db operations 
     } 
    } 
} 

如果你的依賴被註冊,引擎會從你的主APPHOST有dbFactory。

至於項目/解決方案設置,我建議查看推薦的ServiceStack Physical Project Structurealso on SO)。