2015-10-13 20 views
1
發現

我有以下容器解決默認實例,如果沒有別名在Unity

IUnityContainer container = new UnityContainer(); 
container.RegisterType<IFoo, FooOne>("One"); 
container.RegisterType<IFoo, FooTwo>("Two"); 
container.RegisterType<IFoo, FooThree>("Three"); 
container.RegisterType<IFoo, FooFour>("Four"); 
container.RegisterType<IFoo, FooFive>("Five"); 
container.RegisterType<IFoo, FooSix>("Six"); 
現在

當我訪問它,我使用

IFoo foo = container.Resolve<IFoo>(AliasString); 

現在的問題是我從獲得別名串用戶,並且希望如果別名不在註冊中,則返回FooOne,例如 如果別名被傳遞爲「SEVEN」,那麼它應該返回FooOne

是t這裏有什麼辦法來實現它?

注:我不想對容器註冊一個環......

請幫助容器

回答

1

使用IsRegistered方法:

IFoo foo; 
if (Container.IsRegistered<IFoo>(AliasString)) 
{ 
    foo = container.Resolve<IFoo>(AliasString); 
} 
else 
{ 
    foo = container.Resolve<IFoo>("One"); 
} 

爲了排除循環檢查你可以把這個包裝到一些工廠:

public class Factory 
{ 
    private readonly IUnityContainer _container; 
    private readonly HashSet<string> _classes = new HashSet<string>(); 

    public Factory(IUnityContainer container) 
    { 
     _container = container; 
    } 
    public void Register<TInterface, TClass>(string alias) where TClass : TInterface 
    { 
     _classes.Add(alias); 
     _container.RegisterType<TInterface, TClass>(alias); 
    } 
    public TInterface Resolve<TInterface>(string alias) 
    { 
     if (_classes.Contains(alias)) 
      return _container.Resolve<TInterface>(alias); 
     return _container.Resolve<TInterface>("default"); 
    } 
} 

var factory = new Factory(container); 
factory.Register<IFoo, FooOne>("One"); 
IFoo foo = factory.Resolve<IFoo>(AliasString); 
+0

正如我所說我不想有一個循環繼續註冊人每一次,和.IsRegistered是一樣的:( –

+0

@ N.K什麼原因不使用循環? – Backs

+0

如果我打了100次,就會有 –

相關問題