短い質問
抽象ファクトリインターフェイスと実際のファクトリはどこに配置すればよいですか?
概要
私は単純なビデオトランスコーディングアプリケーションを作成していて、依存性注入に頭を悩ませようとしています。
VisualStudioでアプリケーションをいくつかのプロジェクトに分割しました。
- アプリケーションエンジンで使用されるトランスコーダ用の1つのクラスライブラリ
- GUIまたはコンソールインターフェイスで使用されるアプリケーションエンジン用の1つのクラスライブラリ
- 今のところメインのユーザーインターフェイスとなる1つのコンソールアプリケーション
DIなし
これは、依存性注入前のすべてがどのように見えるかです
トランスコーダーライブラリ:
namespace SimpleFFmpeg {
public interface ITranscoder {
void Transcode(String fileName);
}
public class Transcoder:ITranscoder {
// ...
public void Transcode(String fileName) {
// do transcoding stuff
}
// ...
}
}
PusherEngine lib:
using SimpleFFmpeg;
namespace PusherLib {
public class PusherEngine {
private readonly List<VideoItem> _items;
public PusherEngine() {
_items = new List<VideoItem>();
}
// ...
public void processItems() {
foreach (VideoItem item in _items) {
ITranscoder t = new Transcoder();
t.Transcode(item.FileName);
}
}
// ...
}
}
実際のアプリケーション:
namespace Pusher {
class Program {
static void Main(string[] args) {
PusherEngine pe = new PusherEngine();
pe.addVideoItem(new VideoItem(...));
pe.processItems();
}
}
}
DIを使用するためのリファクタリング
この質問で提案されているように、汎用の抽象ファクトリインターフェイスを作成します:依存性注入を使用しながら新しいインスタンスを作成する
public interface IFactory<T> {
T Get();
}
次に、ITranscoderを作成するファクトリを作成します
public class TranscoderFactory: IFactory<ITranscoder> {
public ITranscoder Get() {
return new SimpleFFmpeg.Transcoder();
}
}
次に、PusherEngineを変更して、コンストラクターにファクトリ依存関係を要求します。
using SimpleFFmpeg;
namespace PusherLib {
public class PusherEngine {
private readonly IFactory<ITranscoder> _transcoderFactory;
private readonly List<VideoItem> _items;
public PusherEngine(IFactory<ITranscoder> transcoderFactory) {
_items = new List<VideoItem>();
_transcoderFactory = transcoderFactory;
}
// ...
public void processItems() {
foreach (VideoItem item in _items) {
ITranscoder t = _transcoderFactory.Get();
t.Transcode(item.FileName);
}
}
// ...
}
}
最後に、プログラムでは次のようになります。
namespace Pusher {
class Program {
static void Main(string[] args) {
IFactory<ITranscoder> f = new TranscoderFactory();
PusherEngine pe = new PusherEngine(f);
pe.addVideoItem(new VideoItem(...));
pe.processItems();
}
}
}
質問
IFactoryインターフェイスはどのlib/projectで定義する必要がありますか?TranscoderFactoryはどのlib/プロジェクトで定義する必要がありますか?
彼らはトランスコーダーライブラリに住んでいますか?PusherLibでは?または実際のフロントエンドアプリケーションで?ベストプラクティスを探しています。
ありがとう!