2012-12-17 181 views
3

是否可以在註冊表中註冊接口,然後「重新註冊」它以覆蓋首次註冊?結構圖 - 覆蓋註冊

即:

For<ISomeInterface>().Use<SomeClass>(); 
For<ISomeInterface>().Use<SomeClassExtension>(); 

我想在這裏上運行什麼是我的對象工廠返回SomeClassExtension當我問ISomeInterface

在此先感謝!

回答

2

好消息,我發現是的。這一切都取決於註冊表規則添加到對象工廠容器的順序。因此,如果您像我一樣使用多個註冊表類,則需要找到一種方法來優先將它們添加到容器中。

換句話說,而不是使用它得到錯誤的順序所有Registry.LookForRegistries(),試圖找到所有Registry文件,將它們在你希望的順序和手動添加的對象工廠容器:

ObjectFactory.Container.Configure(x => x.AddRegistry(registry)); 

這樣,您就可以完全控制所需的規則。

希望它能幫助:)

1

我只是想我的解決方案添加到這個問題時,我需要重寫註冊表的某些部分在我SpecFlow測試。

我確實在我的搜索中很早就發現了這個線程,但它並沒有真正幫助我找到解決方案,所以我希望它能幫助你。

我的問題是「StoreRegistry」(由應用程序使用)中的「DataContext」使用「HybridHttpOrThreadLocalScoped」,我需要它在我的測試中是「瞬態」。

The code looked like this: 
[Binding] 
public class MySpecFlowContext 
{  
... 
    [BeforeFeature] 
    private static void InitializeObjectFactories() 
    { 
     ObjectFactory.Initialize(x => 
     { 
      x.AddRegistry<StoreRegistry>(); 
      x.AddRegistry<CommonRegistry>(); 
     }); 
    } 
} 

要重寫範圍設置,您需要在註冊中明確設置它。 並且覆蓋需要低於被覆蓋的內容

The working code looks like this: 
[Binding] 
public class MySpecFlowContext 
{  
... 
    [BeforeFeature] 
    private static void InitializeObjectFactories() 
    { 
     ObjectFactory.Initialize(x => 
     { 
      x.AddRegistry<StoreRegistry>(); 
      x.AddRegistry<CommonRegistry>(); 
      x.AddRegistry<RegistryOverrideForTest>(); 
     }); 
    }  

    class RegistryOverrideForTest : Registry 
    { 
     public RegistryOverrideForTest() 
     { 
      //NOTE: type of scope is needed when overriding the registered classes/interfaces, when leaving it empty the scope will be what was registered originally, f ex "HybridHttpOrThreadLocalScoped" in my case. 
      For<DataContext>() 
       .Transient() 
       .Use<DataContext>() 
       .Ctor<string>("connection").Is(ConnectionBuilder.GetConnectionString()); 
     } 
    } 
}