Short question
我應該在哪裏放抽象工廠界面和實際工廠?在哪個庫中應該定義抽象工廠接口和實際工廠?
概述
我正在寫一個簡單的視頻轉碼應用和我試圖環繞依賴注入我的頭。
我已經將我的應用程序分成了幾個Visual Studio工程。
- 一個類庫的代碼轉換器,由應用程序引擎 使用
- 一個類庫將由GUI或控制檯接口
- 一個控制檯應用程序使用的應用程序引擎,將是主要用戶接口現在
沒有DI
這就是一切看起來像依賴注入之前
轉碼器的lib:
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
我創建一個通用的抽象工廠界面,就像這個問題中提出的那樣: Creating new instances while still using Dependency Injection
public interface IFactory<T> {
T Get();
}
接下來我創建了一個工廠,創建ITranscoders
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();
}
}
}
問題
在哪個lib/project應該定義IFactory接口? 應該在哪個lib/project中定義TranscoderFactory?
他們住在Transcoder庫中嗎?在PusherLib中?或者在實際的前端應用程序中? 我正在尋找最佳做法。
謝謝!
+1的結構良好和書面問題... – 2012-04-25 16:30:03
也許我錯過了點,或例如已經被過度簡化,但爲什麼你會需要一個工廠,如果你並不需要在運行時決定什麼實例化?你可以注入ITranscoder。 – 2012-04-26 08:08:23
@filpen引擎需要爲每個項目實例化一個新的ITranscoder。如果沒有工廠就有辦法做到這一點,那麼在這種特殊情況下,這很可能是一種解決方案。 – luddet 2012-04-26 11:47:21