Единство и управление жизнью - PullRequest
3 голосов
/ 20 января 2011

Я не знаю, как правильно описать это, но здесь идет речь.

У меня 4 класса: A, B, C, D.

A вводится с B, C, D
C вводится с D

А за разрешение.
B - синглтон.
C и D я не знаю.

Я хочу, чтобы A и C использовали один и тот же экземпляр D, поэтому каждый раз, когда я определяю A из контейнера, D следует создавать один раз и вводить в A и C.

Самый простой способ - сделать так, чтобы A просто передавал D в C без использования Unity. Но есть ли способ сделать это с Unity? Я использовал только ContainerControlledLifetimeManager и PerResolveLifetimeManager и никогда не являлся дочерним контейнером, что, как я подозреваю, может быть полезно. Я немного играл с этим, но получается довольно грязно. Это можно легко сделать?

Ответы [ 3 ]

11 голосов
/ 20 января 2011

Существует ли более широкий контекст, в котором вы работаете? В ASP.NET я создал PerRequestLifetimeManager, который возвращает один и тот же объект, когда он запрашивается несколько раз в течение одного HTTP-запроса.

РЕДАКТИРОВАТЬ: Вот реализация, если вы заинтересованы.

public class PerRequestLifetimeManager : LifetimeManager
{
    private readonly object key = new object();

    public override object GetValue()
    {
        if (HttpContext.Current != null && HttpContext.Current.Items.Contains(key))
            return HttpContext.Current.Items[key];
        else
            return null;
    }

    public override void RemoveValue()
    {
        if (HttpContext.Current != null)
            HttpContext.Current.Items.Remove(key);
    }

    public override void SetValue(object newValue)
    {
        if (HttpContext.Current != null)
            HttpContext.Current.Items[key] = newValue;
    }
1 голос
/ 05 июня 2012

Если вы используете MVC3, вы можете взглянуть на Unity.Mvc3 http://unitymvc3.codeplex.com

Описание на сайте гласит: «Библиотека, которая позволяет простую интеграцию контейнера Microsoft Unity IoC с ASP.NET MVC 3. Этот проект включает в себя сделанный на заказ DependencyResolver, который создает дочерний контейнер для HTTP-запроса и удаляет все зарегистрированные экземпляры IDisposable в конце запроса. "

Использование http://www.devtrends.co.uk/blog/integrating-the-unity.mvc3-1.1-nuget-package-from-scratch

0 голосов
/ 21 января 2011

Итак, вы хотите разделить D между A & C, когда A разрешается. Как насчет того, чтобы разрешить что-то еще?

Если это просто «один экземпляр D везде», то это ContainerControlledLifetimeManager.

Если вы хотите совместно использовать D только в этом конкретном случае, вы можете зарегистрировать D с именем и PerResolve или ContainerControlled в зависимости от требуемой семантики. Затем при настройке A & C введите D с этим конкретным именем.

Если это что-то еще, мне нужно больше деталей.

Для этого вам, вероятно, не нужно заходить в дочерние контейнеры.

...