2016-10-07 8 views
1

я нашел следующий код в Simple Injector WebsiteКак зарегистрировать одноразовый конкретный тип в простом Injector контейнере

public static void RegisterDisposableTransient<TService, TImplementation>(
    this Container container) 
    where TImplementation : class, IDisposable, TService 
    where TService : class 
{ 
    var scoped = Lifestyle.Scoped; 
    var reg = Lifestyle.Transient.CreateRegistration<TService, TImplementation>(
     container); 

    reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, 
      "suppressed."); 

    container.AddRegistration(typeof(TService), reg); 
    container.RegisterInitializer<TImplementation>(
     o => scoped.RegisterForDisposal(container, o)); 
} 

Я хочу зарегистрировать конкретную реализацию (тот, который не реализует какой-либо конкретный интерфейс), который является одноразовой для переходный объем. Какие изменения мне нужно сделать, чтобы код выше

ответ

1

В случае, если Вы хотите зарегистрировать конкретный одноразовый тип, как правило, самое простое (и лучше), что нужно сделать, это зарегистрировать его как Scoped:

container.Register<MyConcrete>(Lifestyle.Scoped); 

Если вам действительно понадобится, чтобы этот экземпляр был временным (маловероятным), вам нужно будет сделать следующее.

Это просто вопрос использования перегрузки CreateRegistration<TConcrete>:

public static void RegisterDisposableTransient<TConcrete>(this Container container) 
    where TConcrete : class, IDisposable 
{ 
    var scoped = Lifestyle.Scoped; 
    var reg = Lifestyle.Transient.CreateRegistration<TConcrete>(container); 

    reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "suppres"); 

    container.AddRegistration(typeof(TConcrete), reg); 
    container.RegisterInitializer<TConcrete>(
     o => scoped.RegisterForDisposal(container, o)); 
} 
+1

Последняя строка ('scoped.RegisterForDisposal') бросает исключение. Можно ли удалить эту финальную строку? Все дело в том, что это предполагалось не охваченным, но временным, что бросает, однако, если тип сервиса (TConcrete) реализует IDisposable. Идея здесь заключается в том, что пользователь обрабатывает удаление, что особенно необходимо в консольном приложении или веб-службе. Альтернативой является то, что мы должны ссылаться на сам контейнер, чтобы называть BeginScope и т. Д., Но для этого требуется ссылка на контейнер во всем приложении! Большие нет, когда мы можем распоряжаться, являются нашими собственными объектами. Спасибо за любую обратную связь. –

+0

Btw, @ (превосходная) документация Стивена охватывает эту проблему [здесь] (http://simpleinjector.readthedocs.io/en/latest/disposabletransientcomponent.html), но так же, используя область действия в последней строке, когда Я думал, что все дело в том, что он регистрируется как временный, т. Е. Там, где не должно быть управления обработкой области. Вся проблема часто не имеет области действия (так что последняя строка генерирует исключение). Цель регистрации переходного процесса - это когда мы сами обрабатываем удаление. –

+0

Ваш проект вызывает некоторые вопросы для меня, поэтому было бы полезно опубликовать новый вопрос, объясняющий, что вы делаете, какой вид одноразового объекта и как приложение взаимодействует с ним. Это позволяет мне дать более конкретный ответ. Кроме того, интересно увидеть детали исключения. – Steven

 Смежные вопросы

  • Нет связанных вопросов^_^