1

我想在C#中構建一個多層應用程序(服務)。確切地說,我正在嘗試使用ASP.NET Web Api構建一個REST Web服務,該Web服務將由我自己託管(使用Owin)。現在我到目前爲止,我有以下組件(每個都在一個單獨的.dll):

- RestHost(在我的情況下是一個控制檯應用程序)
- RestService(這是我的網絡服務女巫所有控制器)
- InterfacesLayer
- ModelLayer(這裏我用的對象,只是他們的get/set方法)
- 數據層(ModelLayer內每一個類在數據層自己的類,加上存在數據庫連接類)
- BusinessLayer(這裏所有的邏輯都完成了,模型中的每個類都有自己的類,並且該層與REST服務和datalaye進行通信R)。

用IOC(依賴注入)在C#中的數據訪問層

RestHost - 顧名思義,它是我的服務的主人。除此之外,我還在這裏做我的依賴注入。因爲它是沒有太大的代碼,我將它張貼:

static void Main(string[] args) 
    { 

     IUnityContainer container = new UnityContainer(); 
     // Dependency Resolving 
     container.RegisterType<IAktData, AktDataImpl>(new HierarchicalLifetimeManager()); 
     container.RegisterType<IAktService, AktServiceImpl>(new HierarchicalLifetimeManager()); 

     container.RegisterType<ILeistungData, LeistungDataImpl>(new HierarchicalLifetimeManager()); 
     container.RegisterType<ILeistungService, LeistungServiceImpl>(new HierarchicalLifetimeManager()); 

     container.RegisterType<IPersonData, PersonDataImpl>(new HierarchicalLifetimeManager()); 
     container.RegisterType<IPersonService, PersonServiceImpl>(new HierarchicalLifetimeManager()); 

     container.RegisterType<IPersistent, FirebirdDB>(new HierarchicalLifetimeManager()); 


     string serverAddress = ConfigurationManager.AppSettings["serverAddress"]; 
     string connectionString = ConfigurationManager.ConnectionStrings["connectionStrings"].ConnectionString; 

     using (RESTService.StartServer(container, serverAddress,connectionString)) 
     { 

      Console.WriteLine("Server started @ "+ DateTime.Now.ToString() + " on " + serverAddress + "/api"); 
      Console.ReadLine(); 
     } 
    } 

哦,我忘了提,但你可以從代碼中看到它,在我的主機應用程序,我還閱讀App.Config中在我的連接字符串託管。
這是我的問題。我不知道如何從我的服務訪問數據庫連接。在這裏,我在我的數據訪問層中實現了Firebird,但我不確定如何在我的應用程序中使用它。當然最簡單的方法就是創建一個實例並將其傳遞給我的服務,但這是我想要做的最後一件事。我也一直在考慮將Firebird作爲一個靜態類或單例實現,但是我不能使用我的IPersistant接口(除此之外,我不認爲這是正確的方法)。
所以我的問題是,有沒有這種東西的最佳做法?我不知何故需要將連接字符串傳遞給IPersistent(Firebird)的實現,但實際上並沒有在我的RESTService中創建一個Firebird實例。

感謝

回答

0

像你正在構建一個多層應用程序的一般模式是有一個數據層,提供你的服務能夠訪問數據庫,或者持久化數據的其他方法,通常通過存儲庫。

然後,您可以配置您的IoC容器,將連接字符串注入您的存儲庫,然後將您的存儲庫注入到您的服務中。通過這種方式,您的服務對數據如何持久保持不變,並可專注於定義業務邏輯。

我實際上爲存儲庫做了類似的事情,而不是在數據庫中保存數據,而是將其存儲在Azure的CDN上的Blob中。 withing我IOC(在我的情況StructureMap)的配置是這樣的:

string storageApiKey = ConfigurationManager.AppSettings["CloudStorageApiKey"]; 
string storageUsername = ConfigurationManager.AppSettings["CloudStorageUsername"]; 
this.For<IImageStorageRepository>().Use<ImageStorageRepository>().Ctor<string>("storageApiKey").Is(storageApiKey).Ctor<string>("storageUsername").Is(storageUsername); 

隨着我的倉庫看起來像這樣:

public class ImageStorageRepository : IImageStorageRepository 
{ 
    .... 
    public ImageStorageRepository(string storageApiKey, string storageUsername) 
    { 
     this.cloudIdentity = new CloudIdentity() { APIKey = storageApiKey, Username = storageUsername }; 
     this.cloudFilesProvider = new CloudFilesProvider(cloudIdentity); 
    } 
    .... 
} 
+0

最後我已經做到了非常簡單的。我只在我的APP.config文件(我的服務託管應用程序)中寫入我的數據庫配置,然後在我的數據層中讀取連接字符串(每當我需要連接時)。也許我也可以將它存儲在某個地方,所以我不需要每次都閱讀它,但現在對我來說這沒問題。感謝您的回答 – dev01 2014-10-06 13:06:29

+0

很高興幫助。如果你對答案感到滿意,那麼不要忘記標記答案是正確的! – 2014-10-06 13:25:58