使用 DI 正确实现工厂模式
Proper implementation of factory pattern using DI
我有一个关于使用依赖注入在工厂中构建某些抽象的新实例的最简洁方法的问题。问题是我使用了一些多次打开它的视图的演示者,但是当我们只有 "close" 一些视图时,它正在被处理,并且要再次打开视图我需要再次获取一个新的 View 实例然后我可以打开。
目前 "factory" 看起来像这样:
class ViewConstructor<TView> :IViewConstructor<TView>
where TView : class, IView
{
private readonly IIocContainer _iocContainer;
public ViewConstructor(IIocContainer iocContainer)
{
_iocContainer = iocContainer;
}
public TView Construct()
{
return _iocContainer.GetInstance<TView>();
}
}
问题是,我知道在任何地方使用 IocContainer 但不在组合根中是一件坏事。所以我猜测是否有一些 "clean" 方法来实现它。总而言之,我希望能够从工厂获得 MULTIPLE 个 IView 实例。
我在 post 中找到了答案:
看来,该解决方案可能是在工厂中使用“new”生成一个视图。
不幸的是,为了使用通用工厂,每个视图都必须有默认构造函数。否则,每个视图都需要专门的工厂。
我有一个关于使用依赖注入在工厂中构建某些抽象的新实例的最简洁方法的问题。问题是我使用了一些多次打开它的视图的演示者,但是当我们只有 "close" 一些视图时,它正在被处理,并且要再次打开视图我需要再次获取一个新的 View 实例然后我可以打开。
目前 "factory" 看起来像这样:
class ViewConstructor<TView> :IViewConstructor<TView>
where TView : class, IView
{
private readonly IIocContainer _iocContainer;
public ViewConstructor(IIocContainer iocContainer)
{
_iocContainer = iocContainer;
}
public TView Construct()
{
return _iocContainer.GetInstance<TView>();
}
}
问题是,我知道在任何地方使用 IocContainer 但不在组合根中是一件坏事。所以我猜测是否有一些 "clean" 方法来实现它。总而言之,我希望能够从工厂获得 MULTIPLE 个 IView 实例。
我在 post 中找到了答案: 看来,该解决方案可能是在工厂中使用“new”生成一个视图。
不幸的是,为了使用通用工厂,每个视图都必须有默认构造函数。否则,每个视图都需要专门的工厂。