Web API + Unity - Референтен обект dbcontext вече е създаден

Използвам Unity за инжектиране на зависимости.

Имам метод, отговорен за инстанциране на обекта на базата данни, както следва:

        container.RegisterType<DB>(
            new InjectionFactory(c =>
            {
                return new DB();
            })
        );

Проблемът е, че имам метод, който използва два различни обекта, за които се предполага, че се отнасят към един и същ екземпляр на DB, но изглежда, че Unity създава нов екземпляр на DB Object при всяко инжектиране.

Пример за LINQ на заявка:

var test = from tb1 in _db1.method()
           join tb2 in _db2.method() on tb1.code equals tb2.code

_db1 и _db2 препращат към един и същи DB обект, както следва

    DB _db = null;

    public db1(DB dataContext)
    {
        _db = dataContext;
        _db.CommandTimeout = 3600;
    }

Така че получавам следната грешка:

Заявката съдържа препратки към елементи, дефинирани в различен контекст на данни

Може ли някой да ми помогне да поправя регистъра на Unity, за да препраща към вече създадения DB обект, вместо да правя нов всеки път?


person MarceloBarbosa    schedule 12.11.2015    source източник


Отговори (1)


Трябва да регистрирате своя db като сингълтон в контейнера, което означава, че всеки път, когато db бъде поискан, се връща същия екземпляр, това:

container.RegisterType<DB>(new ContainerControlledLifetimeManager())

трябва да го направи, ако това е уеб приложение, вероятно трябва да създадете дъщерен контейнер за всяка заявка, има различни начини да направите това, но може да искате да дадете https://www.nuget.org/packages/Unity.Mvc4/ опит

person Robbert Draaisma    schedule 12.11.2015
comment
Сега, когато регистрирам зависимост, използвам следния код: container.RegisterType<IAdminDB, AdminDB>(new HierarchicalLifetimeManager()); HierarchicalLifetimeManager() трябва да бъде заменен с ContainerControlledLifetimeManager()? - person MarceloBarbosa; 12.11.2015
comment
Правейки както казахте, започнах да получавам тази грешка: An error occurred when trying to create a controller of type 'ExampleController'. Make sure that the controller has a parameterless public constructor.". Без идеи съм. - person MarceloBarbosa; 12.11.2015
comment
@MarceloBarbosa, регистрираш ли ExampleController с контейнера? Можете ли да покажете как изглежда конструкторът ExampleController? Можете ли да покажете как използвате контейнера за разрешаване на обекти? Използвате ли IDependencyResolver или IHttpControllerActivator? - person Yacoub Massad; 13.11.2015
comment
по подразбиране unity използва TransientLifetimeManager, така че всеки път, когато се прави заявка за екземпляр, се създава нов. HierarchicalLifetimeManager и ContainerControlledLifetimeManager създават само един екземпляр от типа reqeust и го използват повторно. Разликата между последните е уместна, когато използвате подчинени контейнери. ContainerControlledLifetimeManager ще се увери, че всички дъщерни контейнери използват един и същ екземпляр, а с HierarchicalLifetimeManager екземплярът е уникален за дъщерен контейнер. - person Robbert Draaisma; 13.11.2015
comment
Що се отнася до вашето изключение на контролера, мисля, че това е отделен проблем и изглежда, че не сте свързали правилно контейнера си с mvc конвейера и mvc резолверът по подразбиране не харесва конструктори с аргументи. - person Robbert Draaisma; 13.11.2015
comment
Поправих проблема с този код: container.RegisterType<DB>(new HierarchicalLifetimeManager(), new InjectionFactory(c => { return new DB(); })); Thanks @RobbertDraaisma - person MarceloBarbosa; 13.11.2015