1

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 のインスタンスを実際に作成する必要はありません。

ありがとう

4

1 に答える 1

0

構築中のようなマルチレイヤー アプリケーションの一般的なパターンは、サービスにデータベースへのアクセスを提供するデータ レイヤー、または通常はリポジトリを介してデータを永続化するその他の方法を使用することです。

その後、IoC コンテナーを構成して、接続文字列をリポジトリに挿入し、リポジトリをサービスに挿入できます。このようにして、サービスはデータの永続化方法にとらわれず、ビジネス ロジックの定義に集中できます。

私は実際に、データをデータベースに永続化する代わりに、Azure の CDN の BLOB に格納するリポジトリに対して同様のことを行います。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);
    }
    ....
}
于 2014-10-03T20:28:53.727 に答える