C# で多層アプリケーション (サービス) を構築しようとしています。正確には、ASP.NET Web Api を使用して REST Web サービスを構築しようとしています。これは、自分で (Owin を使用して) ホストされます。今、私は次のコンポーネントを持っています(それらのすべてが個別の.dllにあります):
-
RestHost
(私の場合はコンソールアプリケーションです)InterfacesLayer
- ModelLayer (私が使用するオブジェクトは、get/set メソッドのみです)
- DataLayer (ModelLayer 内のすべてのクラスには、Datalayer に独自のクラスがあり、さらに Database 接続クラスがあります)
- BusinessLayer (ここですべてのロジックが完了します。ここでも、モデルのすべてのクラスに独自のクラスがあり、このレイヤーは REST サービスおよびデータレイヤーと通信します)。
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 を使用する方法がわかりません。もちろん、最も簡単な方法は、インスタンスを作成してサービスに渡すことですが、これは私がやりたい最後のことです。Firebird を静的クラスまたはシングルトンとして実装することも考えていましたが、IPersistant インターフェイスを使用できません (さらに、これが正しいアプローチだとは思いません)。
だから私の質問は、この種のもののベストプラクティスはありますか? どういうわけか接続文字列を IPersistent (Firebird) の実装に渡す必要がありますが、RESTService で Firebird のインスタンスを実際に作成する必要はありません。
ありがとう