0

При работе над некоторым тестовым приложением у меня возник сценарий, в котором я хочу поделиться одним экземпляром класса среди других экземпляров через Unity.Unity Share Один экземпляр между несколькими объектами

У меня есть интерфейс под названием ICommon, и это было реализовано в Common class. У меня есть два других интерфейса IInterface1 и IInterface 2, которые были реализованы в Class1 и CLass2. Но Class1 и Class2 имеют зависимость от ICommon, и эта зависимость разрешается через Unity. Но моя проблема заключается в том, что они не используют один и тот же экземпляр, а создают несколько экземпляров ICOmmon. Поэтому я ищу что-то, благодаря чему Unity будет делиться одним и тем же объектом, если он уже создан или создаст новый.

общественный интерфейс ICommon { void Method1(); }

public class Common : ICommon 
{ 
    public void Method1() 
    { 
     return; 
    } 
} 


public interface IInterface1 
{ 
    void Function1(); 
} 

public class Class1 : IInterface1 
{ 
    private readonly ICommon _common; 
    public Class1(ICommon common) 
    { 
     _common = common; 
    } 
    public void Function1() 
    { 
     return; 
    } 
} 

public interface IInterface2 
{ 
    void Function1(); 
} 

public class Class2 : IInterface2 
{ 
    private readonly ICommon _common; 
    public Class2(ICommon common) 
    { 
     _common = common; 
    } 
    public void Function1() 
    { 
     return; 
    } 
} 

public static void RegisterComponents() 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<IInterface1, Class1>(); 
    container.RegisterType<IInterface2, Class2>(); 
    container.RegisterType<ICommon, Common>(); 

    DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
} 

public class Test 
{ 
    private IInterface1 _interface1; 
    private IInterface1 _interface2; 
    public Test(IInterface1 interface1, IInterface2 interface2) 
    { 
     _interface1 = interface1; 
     _interface2 = interface2; 
    } 
} 

Так что я хочу один экземпляр должен быть создан для ICommon и будут распределены между Class1 и Class2.

ответ

1

Вы должны использовать ContainerControlledLifetimeManager для singleton. Для получения более подробной информации см. Приведенную ниже ссылку.

https://msdn.microsoft.com/en-au/library/ff647854.aspx

// Register a default (un-named) type mapping with a singleton lifetime 
    container.RegisterType<ICommon, Common>(new ContainerControlledLifetimeManager()); 
    // Following code will return a singleton instance of MySingletonObject 
    // Container will take over lifetime management of the object 
    container.Resolve<ICommon>(); 
+0

Было бы синглтон для все запроса я имею в виду тот же экземпляр будет общими для все запроса пользователя или только для этого запроса. Я использую EntityFramework, и я поместил некоторый код в ICommon (Ex: IDataBaseFactory), чтобы получить экземпляр моего DbContext и хочу разделить один и тот же экземпляр DbContext среди моего репозитория и UnitOfWork, чтобы UnitOfWork мог совершить то, что когда-либо позволяло мне добавить или обновить в моем репозитории. Поэтому я просто хочу убедиться, что это просто для этого запроса не весь пользовательский запрос, иначе шансы на то, что данные будут конфликтующими, если несколько пользователей получат доступ к одному и тому же DbContext. – Deb

+0

Этот вопрос может помочь вам http://stackoverflow.com/questions/4651844/does-resolvet-return-objects-per-session – Rad

+0

Что я узнаю из приведенной выше ссылки, это ContainerControlledLifetimeManager создаст одноэлементный объект и будет разделенных между несколькими экземплярами, но это именно то, чего я не хочу. Я хочу, чтобы экземпляры были для каждого конкретного вызова. Для этого есть код, но для контроллера. – Deb

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