StructureMap 无法使用默认约定正确注册开放泛型
StructureMap can't register open generics with default convention properly
我正在尝试使用默认约定注册我所有的开放泛型类型。
如果我使用如下所示的默认约定,我可以确认我的类型已正确注册。
然而,当我尝试解决它时,它抛出以下错误。
没有注册默认实例,无法自动确定类型 '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>>();
这是 container.WhatDoIHave() 结果
container.WhatDoIHave()
如果我通过显式注册它,它会按预期工作。
container.Configure(x => x.For(typeof(IGenericClass<>)).Use(typeof(GenericClass<>)));
var sad = container.GetInstance<IGenericClass<DummyClass>>();
这是 container.WhatDoIHave() 结果
您可能会注意到,两个 registries.The 注册表之间存在细微差别,默认约定包括程序集和模型名称,而显式注册表则没有。
有什么方法可以自动注册所有开放泛型,而无需显式提供所有泛型吗?
据我所知,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());
我正在尝试使用默认约定注册我所有的开放泛型类型。 如果我使用如下所示的默认约定,我可以确认我的类型已正确注册。
然而,当我尝试解决它时,它抛出以下错误。
没有注册默认实例,无法自动确定类型 '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>>();
这是 container.WhatDoIHave() 结果
container.WhatDoIHave()
如果我通过显式注册它,它会按预期工作。
container.Configure(x => x.For(typeof(IGenericClass<>)).Use(typeof(GenericClass<>)));
var sad = container.GetInstance<IGenericClass<DummyClass>>();
这是 container.WhatDoIHave() 结果
您可能会注意到,两个 registries.The 注册表之间存在细微差别,默认约定包括程序集和模型名称,而显式注册表则没有。
有什么方法可以自动注册所有开放泛型,而无需显式提供所有泛型吗?
据我所知,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());