2014-11-05 2 views
3

У меня есть простая абстрактная реализация Factory:Abstract Factory с Unity

public abstract class ICarFactory{ 
    public abstract ISportsCar CreateSportCar(); 
    public abstract IFamilyCar CreateFamilyCar(); 
} 

public abstract class ISportsCar {   
    public abstract void Accelerate(); 
} 

public abstract class IFamilyCar { 
    public abstract void Accelarete(); 
} 

public class BMWFactory : ICarFactory { 
    public override ISportsCar CreateSportCar() { 
     return new BMWi7(); 
    } 

    public override IFamilyCar CreateFamilyCar() { 
     return new BMWM5(); 
    } 
} 

public class WolksvagenFactory : ICarFactory { 

    public override ISportsCar CreateSportCar() { 
     return new WVGolfR(); 
    } 

    public override IFamilyCar CreateFamilyCar() { 
     return new WVGolf(); 
    } 
} 

public class BMWi7 : ISportsCar { 
    public override void Accelerate() { 
     Console.WriteLine(this.ToString() + "accelerated."); 
    } 
} 

public class BMWM5 : IFamilyCar { 

    public override void Accelarete() { 
     Console.WriteLine(this.ToString() + "accelerated."); 
    } 
} 

public class WVGolfR : ISportsCar { 

    public override void Accelerate() { 
     Console.WriteLine(this.ToString() + "accelerated."); 
    } 
} 

public class WVGolf : IFamilyCar { 
    public override void Accelarete() { 
     Console.WriteLine(this.ToString() + "accelerated."); 
    } 
} 

клиентский код, как это:

class Program 
{ 


    static void Main(string[] args) 
    { 
     ISportsCar sportsCar = GetFactory().CreateSportCar(); 
     sportsCar.Accelerate(); 

    } 

    static ICarFactory GetFactory() 
    { 
     string userLocation; 
     userLocation = "Hamburg"; //Get user location from user settings 

     if (userLocation == "Hamburg") 
     { 
      return new BMWFactory(); 
     } 
     else 
     { 
      return new WolksvagenFactory(); 
     } 
    } 


} 

Можно ли достичь работы по "GetFactory()" метод с использованием Microsoft.Practices.Unity?

Прошло много времени, ища эту проблему. Но я не мог найти что-то полезное.

ответ

5

Вы можете осуществить это с именем регистрации путем регистрации набора конкретных заводов по месту и по умолчанию:

_container = new UnityContainer();  
//Register location specific factories 
_container.RegisterType<ICarFactory,BMWFactory>("Hamburg"); 
... 
//Register the default factory 
_container.RegisterType<ICarFactory,WolksvagenFactory>(); 

Вы можете использовать следующий код для разрешения завода (с использованием IsRegistered, чтобы проверить, есть ли конкретный завод расположения):

static ICarFactory GetFactory() 
{ 
    string userLocation; 
    userLocation = "Hamburg"; //Get user location from user settings 

    //try get specific factory for location 
    if(_container.IsRegistered<ICarFactory>(userLocation)){   
     return _container.Resolve<ICarFactory>(userLocation); 
    } 
    //if not found, get default factory 
    return _container.Resolve<ICarFactory>(); 
} 

См скрипка here

+1

Спасибо, это потрясающе. – fkucuk

2

Это возможно.

Зарегистрировать CarFactories с именем в контейнере единства

_container.RegisterType<ICarFactory, BMWFactory>("Hamburg"); 
_container.RegisterType<ICarFactory, WolkswagenFactory>("Wolfsburg"); 

Затем измените способ, чтобы использовать контейнер единства, чтобы вернуть экземпляр вашего завода

return _container.Resolve<ICarFactory>(userLocation); 
+0

Это является удивительным. Спасибо! – fkucuk

Смежные вопросы