2015-09-23 36 views
0

我想基于this article实现依赖注入。 在这篇文章中,有两种类型的游戏之一使用微软统一的依赖注入

一个)井字

b)中TrivialPursuit

类型注册由下面的代码

// Declare a Unity Container 
var unityContainer = new UnityContainer(); 
// Register IGame so when dependecy is detected 
// it provides a TrivialPursuit instance 
unityContainer.RegisterType<IGame, TrivialPursuit>(); 
// Instance a Table class object through Unity 
var table = unityContainer.Resolve<Table>(); 
Console.WriteLine(table.GameStatus()); 
Console.ReadLine(); 

如果我不得不做多个游戏并且希望业务层中的一些逻辑来决定选择哪个游戏

a)井字棋

B)马里奥

C)TrivialPursuit

请问我要单独注册三个游戏。如果我需要确保它适用于所有游戏,并且代码可以根据传递的游戏选择游戏,那么最佳方法是什么?

有没有Vb.net的例子。

// Declare a Unity Container 
var unityContainer = new UnityContainer(); 
string game ; 
if(game="tictactoe") 
{ 
    // it provides a TictacToe instance 
    unityContainer.RegisterType<IGame, TictacToe>(); 
    // Instance a Table class object through Unity 
    var table = unityContainer.Resolve<Table>(); 
    Console.WriteLine(table.GameStatus()); 
    Console.ReadLine(); 
} 
elseif(game="TrivialPursuit") 
{ 
    // Register IGame so when dependecy is detected 
    // it provides a TrivialPursuit instance 
    unityContainer.RegisterType<IGame, TrivialPursuit>(); 
    // Instance a Table class object through Unity 
    var table = unityContainer.Resolve<Table>(); 
    Console.WriteLine(table.GameStatus()); 
    Console.ReadLine(); 
} 
elseif(game="Mario") 
{ 
    // Register IGame so when dependecy is detected 
    // it provides a Mario instance 
    unityContainer.RegisterType<IGame, Mario>(); 
    // Instance a Table class object through Unity 
    var table = unityContainer.Resolve<Table>(); 
    Console.WriteLine(table.GameStatus()); 
    Console.ReadLine(); 
} 
+0

顺便说一句,我没有在这里看到任何vb.net –

回答

0

我会建议注册所有的游戏,让业务逻辑决定什么游戏应该由用户的选择创建。

这可能不是最好的方法,因为除此之外可能会有更好的方法,但让我介绍一下我的解决方案。

解决方案语境:

  • 我注册的所有游戏具有独特的名称,如井字游戏,在unitycontainer注册时trivaiapuruit 和马里奥。
  • 我创建了一个工厂,将创建类型的游戏基础,并注入它的unitycontainer 。 “我认为工厂的路要走”
  • 我加ITable表实现,也注册了它,并解决使用ITable,这样它会给你的灵活性,如果您后来决定用不同的实现
  • 来装饰它是表我创建了一个将执行业务逻辑的服务。

示例代码:

// Put this registration in composite root 
var unityContainer = new UnityContainer(); 
unityContainer.RegisterType<IGame, TictacToe>("tictactoe"); 
unityContainer.RegisterType<IGame, TrivialPursuit>("triviapursuit"); 
unityContainer.RegisterType<IGame, Mario>("mario"); 
unityContainer.RegisterType<IGameFactory, GameFactory>(unityContainer); 
unityContainer.RegisterType<IGameService, GameService>(); 
unityContainer.RegisterType<ITable, Table>(); 

// Game factory implementation 
public class GameFactory : IGameFactory 
{ 
    private readonly IUnityContainer _unityContainer; 

    public GameFactory(IUnityContainer unityContainer) 
    { 
     if(unityContainer == null) 
      throw new NullReferenceException("unityContainer"); 

     _unityContainer = unityContainer; 
    } 

    // GameType should be equal to the name upon registratoin 
    // Ex. Game registered is tictactoe 
    //  GameType should be also tictactoe upon resolving. 
    public ITable CreateGame(string gameType) 
    { 
     var gameSelected = _unityContainer.Resolve<IGame>(gameType) 

     return _unityContainer.Resolve<ITable>(new ResolverOverride[] 
     { 
      new ParameterOverride("IGame", gameSelected) 
     }); 
    } 
} 

// Game service implementation 
public class GameService : IGameService 
{ 
    private readonly IGameFactory _gameFactory; 

    public GameService(IGameFactory gameFactory) 
    { 
     if(gameFactory == null) 
      throw new NullReferenceException("gameFactory"); 

     _gameFactory = gameFactory; 
    } 

    // To avoid exception for unkown gametype enforce with constant 
    // variable or enum depend on your choice 
    public void StartGame(string gameType) 
    { 
     var tableGame = _gameFactory.CreateGame(gameType); 

     tableGame.Play(); 
     tableGame.GameStatus();  
    } 
} 

注:此代码并没有进行测试,我没有它的翻译VB.net。