抽象工厂使用Unity [英] Abstract Factory with Unity
问题描述
我有一个简单的抽象工厂实现:
I have a simple Abstract Factory implementation:
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.");
}
}
客户端代码是这样的:
The client code is like this:
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();
}
}
}
是否有可能通过使用Microsoft.Practices.Unity实现由GetFactory()方法做的工作?
Is it possible to achieve the job done by "GetFactory()" method by using Microsoft.Practices.Unity?
我通过搜索关于通过了大量的时间这个问题。但我找不到有用的东西。
I have passed a lot of time by searching about this issue. But I could not find something useful.
推荐答案
您可以通过注册一组每个位置的特定工厂实施名为注册和默认出厂:
You can implement that with named registrations by registering a set of specific factories per location and a default factory:
_container = new UnityContainer();
//Register location specific factories
_container.RegisterType<ICarFactory,BMWFactory>("Hamburg");
...
//Register the default factory
_container.RegisterType<ICarFactory,WolksvagenFactory>();
您就可以使用下面的代码来解决工厂(使用的 IsRegistered
检查如果有一个位置的特定工厂):
You can then use the following code to resolve the factory (using IsRegistered
to check if there is a specific factory for the location):
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>();
}
请参阅小提琴的这里
这篇关于抽象工厂使用Unity的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!