Регистр экземпляра в контейнере Unity для создания объекта singleton [duplicate]

Я хотел бы добавить одну вещь к отличному ответу chazomaticus :

Не забудьте также тег META (например, или HTML4 или XHTML-версия этого файла ):


Это кажется тривиальным, но IE7 дал мне проблемы с этим раньше.

Я делал все правильно; база данных, соединение с базой данных и HTTP-заголовок Content-Type были настроены на UTF-8, и она отлично работала во всех других браузерах, но Internet Explorer по-прежнему настаивал на использовании «западноевропейской» кодировки.

It оказалось, что на странице отсутствует метка META. Добавление этого решения проблемы.

Правка:

У W3C фактически есть довольно большой раздел , посвященный I18N . У них есть ряд статей, связанных с этой проблемой & ndash; описывая HTTP, (X) HTML и CSS сторону вещей:

Они рекомендуют использовать как HTTP-заголовок, так и HTML метатег (или объявление XML в случае XHTML служил XML).

17
задан Bern 30 May 2013 в 13:48
поделиться

3 ответа

Во-первых, вам нужен правильный менеджер времени жизни , для ContainerControlledLifetimeManager для синглетонов.

Для пользовательской инициализации вы, вероятно, можете использовать InjectionFactory

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

Edit1: это должно помочь

public static void Register(IUnityContainer container)
{
    container
        .RegisterType<IEmail, Email>(
        new ContainerControlledLifetimeManager(),
        new InjectionFactory(c => new Email(
            "To Name", 
            "to@email.com")));
}

, а затем

var opEntity = container.Resolve<OperationEntity>();

Edit2: для поддержки сериализации вам придется перестроить зависимости после десериализации:

public class OperationEntity
{
   // make it public and mark as dependency   
   [Dependency]
   public IEmail _email { get; set;}

}

, а затем

OperationEntity entity = somehowdeserializeit;

// let unity rebuild your dependencies
container.BuildUp( entity );
35
ответ дан Hakam Fostok 27 August 2018 в 06:12
поделиться

Вы можете использовать:

container.RegisterType<IEmail, Email>(new ContainerControlledLifetimeManager());
11
ответ дан aquaraga 27 August 2018 в 06:12
поделиться

Если IEmail является одноэлементным, без зависимостей (только пользовательские аргументы), вы можете его обновить самостоятельно:

container.RegisterInstance<IEmail>(new Email("To Name", "to@email.com"));

Это зарегистрирует экземпляр, предоставленный в качестве одиночного элемента для контейнера.

Затем вы просто разрешаете службу:

container.Resolve<OperationEntity>();

И поскольку вы разрешаете конкретный тип, регистрация не требуется. Тем не менее, если вы хотите, чтобы эта служба также была одиночной, вы можете зарегистрировать ее с помощью ContainerControlledLifetimeManager, а затем все вызовы для решения (или при вводе ее как зависимости другому классу) вернут один и тот же экземпляр:

container.RegisterType<OperationEntity>(new ContainerControlledLifetimeManager());
6
ответ дан Julian Dominguez 27 August 2018 в 06:12
поделиться
Другие вопросы по тегам:

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