C# StructureMap打开泛型类型

C# StructureMap打开泛型类型,c#,.net,dependency-injection,structuremap,C#,.net,Dependency Injection,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) {

我有以下课程:

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();
    }
}
公共接口IRenderer
{
字符串渲染(T obj);
}
公共类泛型{}
公共类SampleGenericRender:iRender
{
公共字符串呈现(通用obj)
{
抛出新的NotImplementedException();
}
}
我想能够调用StructureMap与
ObjectFactory.GetInstance()
和receive
SampleGenericRenderer

我当前正在使用以下注册,并在调用GetInstance时收到此错误。“无法强制转换类型为的对象:

ConsoleApplication1.SampleGenericRenderer'1[ConsoleApplication1.Generic'1[System.String]] 打字 'ConsoleApplication1.iRender'1[ConsoleApplication1.Generic'1[System.String]]

公共类CoreRegistry:Registry
{
公共注册处()
{
扫描(组装扫描仪=>
{
组装扫描仪
.AssemblyContainingType(typeof(iRender));
assemblyScanner.AddAllTypesOf(typeof(iRender));
组装扫描仪
.连接实现类型关闭(
类型(iRender));
});
}
}
有没有办法配置StructureMap,使其创建
SampleGenericRenderer
而不是
SampleGenericRenderer

更新:我最终自己为这个依赖项子集进行了类型构造。因为它们将上下文绑定与许多不受支持的泛型绑定相结合,所以这是最干净的解决方案。

对我来说,这很有效:

class Program
{
    static void Main()
    {
        ObjectFactory.Configure(x=>x.AddRegistry<CoreRegistry>());

        var instance = ObjectFactory.GetInstance(typeof(IRenderer<string>)) as IRenderer<Generic<string>>;

        var render = instance.Render(new Generic<string>());

    }
}
类程序
{
静态void Main()
{
Configure(x=>x.AddRegistry());
var instance=ObjectFactory.GetInstance(typeof(IRenderer))作为irender;
var render=instance.render(新的泛型());
}
}
这会引发一个异常:

ObjectFactory.GetInstance<IRenderer<Generic<string>>>();
ObjectFactory.GetInstance();
你真正的问题是什么

编辑:

在某些情况下,这也可以起作用(如果您在设计时不知道
Generic
):

static void Main()
{
Configure(x=>x.AddRegistry());
var instance=ObjectFactory.GetInstance(typeof(irender));
var methodInfo=instance.GetType().GetMethod(“呈现”);
Invoke(实例,new[]{new Generic()});
}
对我来说,这很有效:

class Program
{
    static void Main()
    {
        ObjectFactory.Configure(x=>x.AddRegistry<CoreRegistry>());

        var instance = ObjectFactory.GetInstance(typeof(IRenderer<string>)) as IRenderer<Generic<string>>;

        var render = instance.Render(new Generic<string>());

    }
}
类程序
{
静态void Main()
{
Configure(x=>x.AddRegistry());
var instance=ObjectFactory.GetInstance(typeof(IRenderer))作为irender;
var render=instance.render(新的泛型());
}
}
这会引发一个异常:

ObjectFactory.GetInstance<IRenderer<Generic<string>>>();
ObjectFactory.GetInstance();
你真正的问题是什么

编辑:

在某些情况下,这也可以起作用(如果您在设计时不知道
Generic
):

static void Main()
{
Configure(x=>x.AddRegistry());
var instance=ObjectFactory.GetInstance(typeof(irender));
var methodInfo=instance.GetType().GetMethod(“呈现”);
Invoke(实例,new[]{new Generic()});
}

我认为StructureMap没有任何机制来关闭这样的内部泛型参数

这并不理想,但您可以尝试创建自己的
IRegistrationConvention
,并且每当遇到属于
Generic
封闭类型的类型时,请执行以下操作:

var generic_t = typeof(Generic<>).MakeGenericType(type);
var sample_renderer_t = typeof(SampleGenericRenderer<>).MakeGenericType(type);
var renderer_t = typeof(IRenderer<>).MakeGenericType(generic_t);
graph.AddType(renderer_t, sample_renderer_t);
var generic\u t=typeof(generic)。MakeGenericType(type);
var sample\u renderer\u t=typeof(SampleGenericRenderer);
var renderer\u t=typeof(IRenderer).MakeGenericType(generic\u t);
AddType(渲染器、示例渲染器);

有关更多详细信息,请参阅。

我认为StructureMap没有任何机制可以关闭这样的内部泛型参数

这并不理想,但您可以尝试创建自己的
IRegistrationConvention
,并且每当遇到属于
Generic
封闭类型的类型时,请执行以下操作:

var generic_t = typeof(Generic<>).MakeGenericType(type);
var sample_renderer_t = typeof(SampleGenericRenderer<>).MakeGenericType(type);
var renderer_t = typeof(IRenderer<>).MakeGenericType(generic_t);
graph.AddType(renderer_t, sample_renderer_t);
var generic\u t=typeof(generic)。MakeGenericType(type);
var sample\u renderer\u t=typeof(SampleGenericRenderer);
var renderer\u t=typeof(IRenderer).MakeGenericType(generic\u t);
AddType(渲染器、示例渲染器);

有关更多详细信息,请参阅。

正如Pete所解释的,StructureMap可能无法做到这一点。其他DI容器可能会取得更大的成功,但并非所有容器都能很好地支持更复杂的通用技巧。我所知道的唯一一个可以让您做到这一点的方法是。对于简单的注入器,您只需要以下条件外形:

var container=newcontainer();
容器寄存器(类型为(iRender),类型为(SampleGenericRender));
//用法
var renderer=container.GetInstance();
Render.Render(新的泛型());

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

正如Pete所解释的,StructureMap可能无法做到这一点。其他DI容器可能会取得更大的成功,但并非所有的容器都能很好地支持更复杂的通用技巧。我所知道的唯一一个可以确保让您做到这一点的是。使用简单的注入器,您只需对以下配置进行了修改:

var container=newcontainer();
容器寄存器(类型为(iRender),类型为(SampleGenericRender));
//用法
var renderer=container.GetInstance();
Render.Render(新的泛型());

关于这个方法的更多信息可以找到。

我想这个例子的问题是,我不知道从客户端代码中的SampleGenericRenderer,所以我不能把它扔掉。我从客户端知道的是,我有一个泛型,我需要一个类来处理它的渲染。不,我不认为它是真实例子中的DTO。我认为如果我没有遗漏某些内容,那么更改后的代码将返回错误的呈现程序。在实际代码中,除了iRender之外,还会有iRender。我猜这个示例的问题是我没有