Как я могу настроить Structuremap к автоматическому типу сканирования в блоке и Кэше Singleton?

Получение оплаты за программу, как правило, является одним из худших видов использования человеческого времени.

Во-первых, вы соревнуетесь с элбонцами, которые работают четверть дня. Вы должны убедить своего работодателя, что вы предлагаете что-то, что эльбонийцы никогда не могут, и что ваше что-то стоит приемлемой зарплаты. По мере того как эльбонцы получают все больше и больше иностранных компаний, реальное преимущество уменьшается, и руководство это знает.

Во-вторых, ты тратишь время на решение чужих проблем. Это время, которое вы могли бы потратить на продвижение своих собственных интересов или работу над проблемами, которые действительно вас интересуют. И если вы думаете, что спасаете мир, работая над проблемами других людей, то почему бы вам просто не заставить эльбонийцев сделать это за вас?

Наконец, замечательные инновации в программном обеспечении (visicalc , Napster, Pascal и т. Д.) Не были созданы в фермерских хозяйствах. Они были созданы одним или двумя людьми без предоплаты. Вы не можете принудительно воссоздать это. Это просто волшебство, которое иногда случается, когда у компетентного программиста есть действительно хорошая идея.

Достаточно программного обеспечения. Есть достаточно разработчиков программного обеспечения. Вам не нужно быть одним на прокат. Сохраните свои таланты, свое время, свои волосы, свой брак. Пусть кто-нибудь еще продаст свою душу клавиатуре. Если вы хотите программировать, хорошо. Но не делайте это за деньги.

7
задан Jørgen R 9 February 2015 в 13:51
поделиться

2 ответа

Используя новый API в версии 2.6, ITypeScanner устарел. Это должно быть реализовано в виде конвенции. Простой пример: вы хотите зарегистрировать соглашение о том, что все типы определенного интерфейса являются одноэлементными:

    Scan(a =>
    {
        a.AssemblyContainingType<IMyPluginType>();
        a.With(new SingletonConvention<IMyPluginType>());
        a.AddAllTypesOf<IMyPluginType>();
    });

Затем:

    internal class SingletonConvention<TPluginFamily> : IRegistrationConvention
    {
        public void Process(Type type, Registry registry)
        {
            if (!type.IsConcrete() || !type.CanBeCreated() || !type.AllInterfaces().Contains(typeof(TPluginFamily))) return;

            registry.For(typeof(TPluginFamily)).Singleton().Use(type);
        }
    }
19
ответ дан 6 December 2019 в 08:45
поделиться

Вам нужно будет реализовать ITypeScanner, подобный тому, что Джереми Миллер описывает на http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/ create-your-own-auto-registration-agreement-with-structuremap.aspx

Так что для ваших контроллеров, например, я бы изменил этот вызов Scan на:

x.Scan(y => {
    y.TheCallingAssembly();
    y.With<MyNewTypeScanner>();
});

Затем я бы определил класс в другом месте, который выглядел бы примерно как это:

public class MyNewTypeScanner: ITypeScanner
{
    //This method is responsible for determining if a type should be registered
    // and then passing it to RegisterType() if so
    public void Process(Type type, PluginGraph graph)
    {
        //At this point you would probably just test to see if type is IController
        //but you can get more sophisticated without too much headache.

        this.RegisterType(graph, type);
    }


    private void RegisterType(PluginGraph graph, Type implementingType)
    {
        //The argument passed to FindFamily must be the type/class that will be requested out of SM
        var family = graph.FindFamily(implementingType);

        family.AddType(implementingType);
        family.SetScopeTo(InstanceScope.Singleton);
    }
}

Это должно помочь вам.

2
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: