Карта единства для структуры - PullRequest
1 голос
/ 09 января 2010

Я пробую код из этого поста на Event Driven Architecture (кстати, очень интересно). Его контейнер IOC - это Unity, и я хотел бы сделать это, используя карту структуры.

Его код:

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

А затем в моем классе начальной загрузки, который вызывается при запуске приложения, у меня есть:

public static void ConfigureStuctureMap()
        {
            ObjectFactory.Initialize(x =>
            {       
                x.Scan(y =>
                {
                    y.Assembly("Domain");           
                    y.Assembly("Website");
                    y.AddAllTypesOf(typeof(IConsumer<>));
                    y.WithDefaultConventions();
                });
            });
        }

Ответы [ 2 ]

3 голосов
/ 09 января 2010

Хотя я не эксперт по Structuremap, я верю, что вы можете сделать это по-другому.

Structuremap имеет возможность сканировать любую данную сборку для данного интерфейса и автоматически регистрировать все реализации.Мы делаем это в моем текущем проекте, и он отлично работает.

Я не помню точный код, который мы используем, но вы можете проверить документацию для сканирования сборки

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

0 голосов
/ 14 января 2010

Создание пользовательского класса TypeScanner, который реализует интерфейс ITypeScanner.

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