统一结构图

时间:2010-01-09 15:13:08

标签: c# structuremap unity-container ioc-container

我正在尝试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();
                });
            });
        }

2 个答案:

答案 0 :(得分:3)

虽然我不是结构图专家,但我相信你可以用另一种方式来做。

Structuremap能够扫描给定接口的任何给定程序集并自动注册所有实现。我们在目前的项目中这样做,它的效果非常好。

我不记得我们使用的确切代码,但您可以查看装配扫描的文档

http://structuremap.sourceforge.net/ScanningAssemblies.htm

答案 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>();
        });