7

私は伝統的にSQLの人です。私は自分のベルトの下でC#の経験をたくさん持っていますが、これらはすべてツールまたはカスタマイズプロジェクトである傾向があります。

私は今、次のことを行うアプリケーションを書くことを任されています...

  • Windowsサービスとして実行
  • ファイルを監視し、ファイルが到着すると、DBにロードします
  • 新しくロードされたファイルがないかDBを監視します
  • それらのファイルに対していくつかの複雑な解析を実行します(dbレコードの集約を含みます)
  • 追加のインターフェースが必要です(解析されたデータを照会するためのWebサイトなど)
  • 複数のファイルタイプをサポートする必要があり、複数のパーサーをサポートする必要があります。

ですから、これはIoCへの私の最初の進出であり、私は物事を誠実に行うために最善を尽くしています。私はAutofacを使用しており、概念に非常に満足しています。私の問題は、構成ルートを理解することです。コンテナを渡しても問題がない場合、従来の「ファクトリ」の概念を何に置き換えますか。私のアプリは、L2Sモデルとその上の汎用リポジトリインターフェースで構成されています。Autofacモジュールを使用して具体的なタイプを登録します。私はロガーを持っていて、モジュールを使用して具体的なタイプも登録しています。テストコンソールアプリ(Windowsサービスホストに置き換えられます)で、コンテナーを作成し、ロガーモジュールやdalモジュールなどを登録します。次に、コンストラクターインジェクションを使用してファイル監視クラスを解決し、ロガーとリポジトリを挿入します。また、キューオブジェクト(私の場合はメモリバックアップキュー、ただし、新しいファイルがエンキューされる(プロデューサー)データベースキューの場合もあります。キューの反対側には、コンシューマーが必要です。したがって、デキューされるファイルのタイプに応じて、別のローダークラスを使用する必要があります。私は歴史的に、適切な具象クラスを返すためにファクトリパターンを使用していました。ローダークラスにはロガーと適切なリポジトリを挿入する必要があるため、ファクトリクラスにIoCコンテナへの参照を指定せずに、キューから出てくるアイテムを処理する適切なローダークラスのインスタンスを作成する方法がわかりません。さまざまなアイテムハンドラーをコンシューマークラスに挿入できることは知っていますが、50個のファイルタイプまたは100個のファイルタイプがあったとすると、これは実用的ではありません。別のローダークラスを使用する必要があります。私は歴史的に、適切な具象クラスを返すためにファクトリパターンを使用していました。ローダークラスにはロガーと適切なリポジトリを挿入する必要があるため、ファクトリクラスにIoCコンテナへの参照を指定せずに、キューから出てくるアイテムを処理する適切なローダークラスのインスタンスを作成する方法がわかりません。さまざまなアイテムハンドラーをコンシューマークラスに挿入できることは知っていますが、50個のファイルタイプまたは100個のファイルタイプがあったとすると、これは実用的ではありません。別のローダークラスを使用する必要があります。私は歴史的に、適切な具象クラスを返すためにファクトリパターンを使用していました。ローダークラスにはロガーと適切なリポジトリを挿入する必要があるため、ファクトリクラスにIoCコンテナへの参照を指定せずに、キューから出てくるアイテムを処理する適切なローダークラスのインスタンスを作成する方法がわかりません。さまざまなアイテムハンドラーをコンシューマークラスに挿入できることは知っていますが、50個のファイルタイプまたは100個のファイルタイプがあったとすると、これは実用的ではありません。ファクトリクラスにIoCコンテナへの参照を与えずに、キューから出てくるアイテムを処理するための適切なローダークラスのインスタンスを作成する方法がわかりません。さまざまなアイテムハンドラーをコンシューマークラスに挿入できることは知っていますが、50個のファイルタイプまたは100個のファイルタイプがあったとすると、これは実用的ではありません。ファクトリクラスにIoCコンテナへの参照を与えずに、キューから出てくるアイテムを処理するための適切なローダークラスのインスタンスを作成する方法がわかりません。さまざまなアイテムハンドラーをコンシューマークラスに挿入できることは知っていますが、50個のファイルタイプまたは100個のファイルタイプがあったとすると、これは実用的ではありません。

これを行う方法を理解した後、新しい解析ジョブ(dbテーブルのエントリ)を監視してそれらを処理するのと同様のことを行う必要がありますが、上記と同様のパターンに従うと想定しています。

アドバイスはありますか?私は、C#をビニングしてファイルをロードするためにSSISに移動し、SSISで厄介なパーサーコードをハッキングすることから、これほど遠く(わずかな距離)離れています。C#の学習者を助けてください。

4

3 に答える 3

1

これが、初心者としてのあなたがどのように始めるべきかについての私の見解です。

クラスの作成を開始します。他のクラスへのすべての依存関係は、コンストラクターで取得されます。

オブジェクトを作成するとき以外は、インスタンスを取得するためにクラスを新しくすることはないため、プログラムは次のようになります。

static void Main(..) {
  var s1 = ...;
  var s2 = ...;
  var sn = ... SN(s1, s2, ..);
  sn.Wait();
}

これで、すべての ... をコンテナー内の登録に置き換えることができます。ファクトリ クラスはまったく使用しません。IoC コンテナーは工場です。そして、ルートの初期化を置き換えます。

var sn = container.Resolve<SN>();

現在、IoC を使用しています。辞書を使わないでください。

于 2012-10-12T07:47:51.133 に答える
1

一連のローダー クラスを新しく作成し、それらを辞書に入れて、コンストラクターに渡すことができることに気付きました。これにより、名前でローダーを要求できます。

于 2012-10-03T07:05:22.277 に答える