Плагины StructureMap, вызывающие метод init при регистрации - PullRequest
2 голосов
/ 02 марта 2010

Я изучаю возможность использования StructureMap для загрузки всех экземпляров моего плагина типа IPlugin из определенного каталога с помощью функции сканирования.

Когда плагин зарегистрирован в StructureMap, я бы хотел вызвать метод Init, который бы регистрировал плагин в базе данных, если это был первый раз, когда его видели.

Есть ли способ "foreach" через зарегистрированные IPlugins, получить ссылку и вызвать Init для каждого?

Я хочу установить плагин для перетаскивания.

Спасибо

Ian

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Вы можете легко просмотреть все плагины, которые сконфигурированы для контейнера, используя свойство Model вне контейнера. Вот пример с сильным каветом . Это, вероятно, не то, что вы ищете. Это всего лишь пример пары способов, которые я придумал для инициализации вещей, которые вы регистрируете в контейнере.

public interface IInitable
{
    void Init();
    bool Inited { get; }
}

public abstract class Initable : IInitable
{
    public bool Inited { get; private set; }

    public void Init()
    {
        Inited = true;
    }
}

public class Initable1 : Initable { }
public class Initable2 : Initable { }

[TestFixture]
public class accessing_the_container_model
{
    [Test]
    public void put_things_in_and_init_then_during_construction()
    {
        var container = new Container(cfg =>
        {
            cfg.For<IInitable>().Use(c =>
            {
                var initable = c.GetInstance<Initable1>();
                initable.Init();
                return initable;
            });
        });

        container.GetAllInstances<IInitable>().Each(i => i.Inited.ShouldBeTrue());
    }

    [Test]
    public void put_things_in_and_init_them()
    {
        var container = new Container(cfg =>
        {
            cfg.For<IInitable>().HybridHttpOrThreadLocalScoped().Add<Initable1>();
            cfg.For<IInitable>().HybridHttpOrThreadLocalScoped().Add<Initable2>();
        });

        foreach (var instance in container.Model.GetAllPossible<IInitable>())
        {
            instance.Init();
        }

        container.GetAllInstances<IInitable>().Each(i=>i.Inited.ShouldBeTrue());
    }
}
2 голосов
/ 03 марта 2010

Использование сканера сборки - отличный способ создать модель плагина.

public class StructuremapBootstrap
{
    public IContainer Container { get; private set; }

    public StructuremapBootstrap()
    {
        Container = new Container(x =>
        {
            //add registries here or do your config.

            //extensibility
            x.Scan(scan =>
            {
                                //some plugin discriminator
                scan.AssembliesFromApplicationBaseDirectory(a => a.FullName.Contains("Plugin")); 

                scan.LookForRegistries();
                scan.AddAllTypesOf<IInitable>();
            });
        });
    }
}

Вы в основном указываете StructureMap искать все сборки, имеющие определенный дискриминатор, я также использовал атрибут сборки маркера. Сканер LookForRegistries удобен, чтобы позволить вашим сборкам плагинов настраивать StructureMap по своему усмотрению. Наконец, у вас есть сканер, добавьте желаемый тип плагина.

...