c# - StructureMap 开放通用类型

标签 c# .net dependency-injection structuremap

我有以下类(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 .

关于c# - StructureMap 开放通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415915/

相关文章:

.net - 为什么NotifyIcon不设置SynchronizationContext?

c# - 如何在WPF或.net Winform程序中嵌入外部程序?

symfony - Symfony2 中的服务依赖注入(inject)

c# - 在 MVC 中,对于具有多个构造函数的 Controller ,我如何指示要调用哪个构造函数?

c# - 为什么 Roslyn 中的 Renamer 不重命名 AnonymousObjectMemberDeclarator ?

c# - 如何更改嵌套 json 结构中的键值对 C#

c# - Visual Studio Sitecore TDS 无法打开 .scproj 项目

c# - 使用 C# ClearCase checkin 和 checkout

c# - 在 .Net 中使用相对文件路径

c# - 通过扩展 DefaultControllerFactory 实现 DI 与实现 IDependencyResolver 之间的区别