我正在尝试Event Driven Architecture上这篇文章中的代码(顺便说一下非常有趣)。他的IOC容器虽然是Unity,但我想使用Structure map来实现这一点。
他的代码是:
public class EventSubscriptions : ISubscriptionService
{
public static void Add<T>()
{
var consumerType = typeof(T);
consumerType.GetInterfaces()
.Where(x => x.IsGenericType)
.Where(x => x.GetGenericTypeDefinition() == typeof(IConsumer<>))
.ToList()
.ForEach(x => IoC.Container.RegisterType(x,
consumerType,
consumerType.FullName));
}
public IEnumerable<IConsumer<T>> GetSubscriptions<T>()
{
var consumers = IoC.Container.ResolveAll(typeof(IConsumer<T>));
return consumers.Cast<IConsumer<T>>();
}
}
我有以下似乎不起作用:
public class SubscriptionService : ISubscriptionService
{
public static void Add<T>()
{
var consumerType = typeof(T);
consumerType.GetInterfaces()
.Where(x => x.IsGenericType)
.Where(x => x.GetGenericTypeDefinition() == typeof (IConsumer<>))
.ToList().ForEach(x => ObjectFactory.Inject(consumerType, x));
}
public IEnumerable<IConsumer<T>> GetSubscriptions<T>()
{
var consumers = ObjectFactory.GetAllInstances(typeof(IConsumer<T>));
return consumers.Cast<IConsumer<T>>();
}
}
我显然对结构图不太熟悉。关于我做错的一些链接或解释将非常感激。
更新
根据亨宁的回答,我最终得到了 -
public class SubscriptionService : ISubscriptionService
{
public IEnumerable<IConsumer<T>> GetSubscriptions<T>()
{
var consumers = ObjectFactory.GetAllInstances(typeof(IConsumer<T>));
return consumers.Cast<IConsumer<T>>();
}
}
然后在我的应用程序启动时调用的bootstrapping类中,我有:
public static void ConfigureStuctureMap()
{
ObjectFactory.Initialize(x =>
{
x.Scan(y =>
{
y.Assembly("Domain");
y.Assembly("Website");
y.AddAllTypesOf(typeof(IConsumer<>));
y.WithDefaultConventions();
});
});
}
答案 0 :(得分:3)
虽然我不是结构图专家,但我相信你可以用另一种方式来做。
Structuremap能够扫描给定接口的任何给定程序集并自动注册所有实现。我们在目前的项目中这样做,它的效果非常好。
我不记得我们使用的确切代码,但您可以查看装配扫描的文档
答案 1 :(得分:0)
构建实现ITypeScanner接口的自定义TypeScanner类。
public class EventSubConventionScanner : ITypeScanner
{
public void Process(Type type, PluginGraph graph)
{
Type interfaceType = type.FindInterfaceThatCloses(typeof(IConsumer<>));
if (interfaceType != null)
{
graph.AddType(interfaceType, type);
}
}
}
之后,在注册表或初始化例程中写:
Scan(x =>
{
x.With<EventSubConventionScanner>();
});