我有以下類別:StructureMap開放式泛型類型
public interface IRenderer<T>
{
string Render(T obj);
}
public class Generic<T> { }
public class SampleGenericRenderer<T> : IRenderer<Generic<T>>
{
public string Render(Generic<T> obj)
{
throw new NotImplementedException();
}
}
我想能夠調用StructureMap與 ObjectFactory.GetInstance<IRenderer<Generic<string>>>();
和接收SampleGenericRenderer<string>
。
我正在使用以下注冊並在調用GetInstance時收到此錯誤。 「無法轉換類型的對象:
ConsoleApplication1.SampleGenericRenderer'1 [ConsoleApplication1.Generic'1 [System.String]] ' 鍵入 ' ConsoleApplication1.IRenderer'1 [ConsoleApplication1.Generic'1 [系統。.String]
public class CoreRegistry : Registry
{
public CoreRegistry()
{
Scan(assemblyScanner =>
{
assemblyScanner
.AssemblyContainingType(typeof(IRenderer<>));
assemblyScanner.AddAllTypesOf(typeof(IRenderer<>));
assemblyScanner
.ConnectImplementationsToTypesClosing(
typeof(IRenderer<>));
});
}
}
有什麼辦法來配置StructureMap,使其產生的SampleGenericRenderer<string>
代替SampleGenericRenderer<Generic<string>>
更新:我結束了我自己爲這個依賴關係的子集進行類型構造。因爲它們將上下文綁定與大量不受支持的通用綁定結合在一起,所以這變成了最乾淨的解決方案。
這絕對是我走下坡路,我認爲它會奏效。有相當多的掃描涉及使它在實際的代碼庫中工作,因爲我必須找到所有可能的通用參數,並且在編譯時我不知道渲染器或渲染類型的任何內容,但最終會讓其他的代碼更清潔。值得注意的是,ITypeScanner在最近版本的StructureMap中被IRegistrationConvention所取代。文檔有點過時了! – 2012-07-11 13:58:51
@ShaneFulmer我忘了那個重命名。事實上,我會相應地更新答案。 – Pete 2012-07-11 14:27:16