我可以使用工厂来实现依赖注入吗
Can i use a Factory to implement dependency injection
有人告诉我,在依赖注入框架出现之前,开发人员会使用工厂来实现 DI。谁能提供一个工厂模式如何用于 DI 的例子。我的意思是,只是考虑一下,工厂就是一个依赖注入器,但我在网上找不到任何例子。
这是我的想法,未经测试的代码(使用 C#)
public class CarFactory : ICarFactory{
private static CarFactory instance = null;
public static ICarFactory SingletonInstance {
get {
if (this.instance == null){
this.instance = new CarFactory();
return this.instance;
}
},
set {
this.instance = value;
}
}
public ICar CreateCar(string make){
switch(make)
{
case "Toyota": return new Toyota();
case "Honda" : return new Honda();
default: throw new Exception();
}
}
}
public interface ICarFactory {
ICar CreateCar(string make);
}
public class Toyota : ICar
{
}
public class Honda : ICar
{
}
用法类似于:
ICar car = CarFactory.SingletonInstance.CreateCar("Toyota");
公开公开 CarFactory 的单例实例使您能够模拟 CarFactory 进行单元测试,并且您可以在调用 CreateCar 时让模拟的 CarFactory return 模拟 ICars。
现在将工厂中的 Cars 替换为实现服务的实际依赖项,例如 类。瞧,你有一个包含所有依赖项的工厂。您现在可以使用工厂来 "resolve" 您的依赖项。您可以通过使用泛型类型和字典(哈希表)进一步推动示例,其中键是类型名称,值是实现实例,例如:
public T Create<T>(){
return mydictionary.get(typeof(T).Name);
}
类似的东西......你明白了......
希望对您有所帮助!
有人告诉我,在依赖注入框架出现之前,开发人员会使用工厂来实现 DI。谁能提供一个工厂模式如何用于 DI 的例子。我的意思是,只是考虑一下,工厂就是一个依赖注入器,但我在网上找不到任何例子。
这是我的想法,未经测试的代码(使用 C#)
public class CarFactory : ICarFactory{
private static CarFactory instance = null;
public static ICarFactory SingletonInstance {
get {
if (this.instance == null){
this.instance = new CarFactory();
return this.instance;
}
},
set {
this.instance = value;
}
}
public ICar CreateCar(string make){
switch(make)
{
case "Toyota": return new Toyota();
case "Honda" : return new Honda();
default: throw new Exception();
}
}
}
public interface ICarFactory {
ICar CreateCar(string make);
}
public class Toyota : ICar
{
}
public class Honda : ICar
{
}
用法类似于:
ICar car = CarFactory.SingletonInstance.CreateCar("Toyota");
公开公开 CarFactory 的单例实例使您能够模拟 CarFactory 进行单元测试,并且您可以在调用 CreateCar 时让模拟的 CarFactory return 模拟 ICars。
现在将工厂中的 Cars 替换为实现服务的实际依赖项,例如 类。瞧,你有一个包含所有依赖项的工厂。您现在可以使用工厂来 "resolve" 您的依赖项。您可以通过使用泛型类型和字典(哈希表)进一步推动示例,其中键是类型名称,值是实现实例,例如:
public T Create<T>(){
return mydictionary.get(typeof(T).Name);
}
类似的东西......你明白了......
希望对您有所帮助!