Skip to main content
 首页 » 编程设计

c#之StructureMap 开放通用类型

2024年02月20日30jillzhang

我有以下类(class):

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]]' to type 'ConsoleApplication1.IRenderer'1[ConsoleApplication1.Generic'1[System.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>> ?

更新:我最终自己为这个依赖项子集进行了类型构建。因为它们将上下文绑定(bind)与许多不受支持的通用绑定(bind)结合在一起,所以这被证明是最干净的解决方案。

请您参考如下方法:

正如 Pete 所解释的,StructureMap 可能无法做到这一点。其他 DI 容器可能会取得更大的成功,但并非所有容器都对更复杂的通用技巧有很好的支持。我知道唯一允许你这样做的是 Simple Injector .使用 Simple Injector,您只需要以下配置:

var container = new Container(); 
 
container.Register(typeof(IRenderer<>), typeof(SampleGenericRenderer<>)); 
 
// Usage 
var renderer = container.GetInstance<IRenderer<Generic<string>>>(); 
 
renderer.Render(new Generic<string>()); 

可以找到有关此方法的更多信息 here .