简短的问题
我应该把抽象工厂接口和实际工厂放在哪里?
概述
我正在编写一个简单的视频转码应用程序,我正试图围绕依赖注入来解决问题。
我已将我的应用程序分成 Visual Studio 中的几个项目。
- 一个用于转码器的类库,由应用程序引擎使用
- 一个用于应用程序引擎的类库,将由 gui 或控制台界面使用
- 目前将作为主要用户界面的一个控制台应用程序
无 DI
这是依赖注入之前的一切
转码器库:
namespace SimpleFFmpeg {
public interface ITranscoder {
void Transcode(String fileName);
}
public class Transcoder:ITranscoder {
// ...
public void Transcode(String fileName) {
// do transcoding stuff
}
// ...
}
}
PusherEngine 库:
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();
}
}
}
问题
IFactory 接口应该在哪个库/项目中定义?TranscoderFactory 应该在哪个库/项目中定义?
他们住在转码器库中吗?在 PusherLib 中?还是在实际的前端应用程序中?我正在寻找最佳实践。
谢谢!