C# StructureMap可以';t使用默认约定正确注册打开的泛型

C# StructureMap可以';t使用默认约定正确注册打开的泛型,c#,structuremap,C#,Structuremap,我正在尝试使用默认约定注册所有打开的泛型类型。 如果我使用如下默认约定,我可以确认我的类型已正确注册 然而,当我试图解决它时,它抛出以下错误 没有注册默认实例,无法自动确定类型“IGenericClass” public DefaultRegistry() { Scan( scan => { scan.AssembliesFromApplicat

我正在尝试使用默认约定注册所有打开的泛型类型。 如果我使用如下默认约定,我可以确认我的类型已正确注册

然而,当我试图解决它时,它抛出以下错误

没有注册默认实例,无法自动确定类型“IGenericClass”

 public DefaultRegistry()
        {
            Scan(
                scan =>
                {
                    scan.AssembliesFromApplicationBaseDirectory(
                        a => a.FullName.StartsWith("StructureMapApp"));
                    scan.WithDefaultConventions();
                });
        }

var container = new Container(x =>
    {
        x.AddRegistry(new DefaultRegistry());

    });
    container.WhatDoIHave();

    var result = container.GetInstance<IGenericClass<DummyClass>>();
public DefaultRegistry()
{
扫描(
扫描=>
{
scan.AssembliesFromApplicationBaseDirectory(
a=>a.FullName.StartsWith(“StructureMapp”);
scan.WithDefaultConventions();
});
}
var容器=新容器(x=>
{
x、 AddRegistry(新的DefaultRegistry());
});
容器。WhatDoIHave();
var result=container.GetInstance();
这是容器。WhatDoIHave()结果 container.WhatDoIHave()

如果我通过显式注册它,它将按预期工作

       container.Configure(x => x.For(typeof(IGenericClass<>)).Use(typeof(GenericClass<>)));
        var sad = container.GetInstance<IGenericClass<DummyClass>>();
container.Configure(x=>x.For(typeof(IGenericClass)).Use(typeof(GenericClass));
var sad=container.GetInstance();
这是container.WhatDoIHave()结果

正如您可能注意到的,这两个注册表之间有一个细微的区别。使用默认约定创建的注册表包括程序集和模型名,而显式注册表则没有


有没有办法自动注册所有打开的泛型而不显式地提供它们?

据我所知,
DefaultConvention
不能做到这一点。但您可以创建自定义约定,例如:

class MapOpenGenericTypesToInterfacesConvention : IRegistrationConvention {
    public void ScanTypes(TypeSet types, Registry registry) {
        var openInterfaces = types.FindTypes(TypeClassification.Open | TypeClassification.Interfaces).ToArray();
        var openConcrete = types.FindTypes(TypeClassification.Open | TypeClassification.Concretes);
        foreach (var type in openConcrete) {
            foreach (var iface in openInterfaces) {
                if (type.GetInterfaces().Where(c => c.IsGenericType).Any(ti => ti.GetGenericTypeDefinition() == iface)) { 
                    registry.For(iface).Use(type);
                }
            }
        }
    }
}
然后加上

scan.With(new MapOpenGenericTypesToInterfacesConvention());

什么是DefaultRegistry?忘了添加它,据我所知,我添加了它-默认约定不打算这样做,您需要编写自定义注册约定。我想这个作业没有任何预构建的约定。