2012-06-27 177 views
0

我有一種情況,我需要從一個開放的泛型基類中按名稱獲取具體類。StructureMap open generic

我的類層次結構:

public class Foo { } 

public class Bar { } 

public abstract class OpenGenericBaseClass<T> where T : class { } 

public class ConcreteClass1 : OpenGenericBaseClass<Foo> { } 

public class ConcreteClass2 : OpenGenericBaseClass<Bar> { } 

我的註冊代碼:

For(typeof(OpenGenericBaseClass<>)).Use(x => x.GetInstance<ConcreteClass1>()); 

For(typeof(OpenGenericBaseClass<>)).Add(x => x.GetInstance<ConcreteClass2>()).Named("Class2"); 

我的程序代碼:

ObjectFactory.Configure(
      x => x.Configure(
       a => a.Scan(
        b => 
        { 
         b.AssembliesFromApplicationBaseDirectory(); 
         b.LookForRegistries(); 
        }))); 

     var c1 = ObjectFactory.GetInstance(typeof(OpenGenericBaseClass<>)); 

     var c2 = ObjectFactory.GetNamedInstance(typeof(OpenGenericBaseClass<>), "Class2"); 

到的GetInstance方法(C1)的第一次調用返回的好「ConcreteClass1」對象。 然而對第二個呼叫(對於C2)我得到一個異常: StructureMap異常代碼:200找不到名爲「等級2」爲PluginType TestStructureMapGeneric.OpenGenericBaseClass`1一個實例

我怎樣才能讓我的C2命名具體實例?

感謝您的幫助。

回答

0

看來StructureMap不支持添加命名配置來打開泛型類型。但是,爲什麼你需要一個開放的泛型類型?在StructureMap中使用開放泛型類型將泛型參數從一個類傳遞到另一個類,這就是爲什麼在不發生異常的情況下不能使用For(typeof(OpenGenericBaseClass<>)).Use(typeof(ConcreteClass1))構造,而必須使用lambda。

public abstract class BaseClass {} 
public abstract class OpenGenericBaseClass<T> : BaseClass where T : class {} 

,並使用下面的註冊表代碼:

對於這個特殊的例子,我可以通過添加不使用開放式泛型類型基類解決各類

For<BaseClass>().Use<ConcreteClass1>(); 
For<BaseClass>().Add<ConcreteClass2>().Named("Class2"); 

現在,我可以使用此代碼輕鬆解決實例:

var c1 = ObjectFactory.GetInstance<BaseClass>(); // of type ConcreteClass1 
var c2 = ObjectFactory.GetNamedInstance<BaseClass>("Class2"); // of type ConcreteClass2 
+0

嗨@Nekresh,我正在使用開放的泛型基類來p使用虛擬方法來幫助我用不同的對象類型組織工作流。我不能使用簡單的基類,因爲我失去了共享泛型行爲的好處。 – klettier