2016-01-11 3 views
1

У меня есть интерфейс IInterface и это выглядит, как показано ниже -MS единство контейнер

public interface IInterface    
{  
    void SomeMethod1();  
    void SomeMethod2(); 
    void SomeMethod3(); 
    .      
    .      
    .      
}  

Одна из реализаций что-то вроде -

public class Implementation : IInterface   
{  
    private Object obj; 
    public Implementation(Object obj)  
    {   
     this.obj = obj; 
     // Do Something   
    }   

    public void SomeMethod1()  
    {  
    lock(obj) 
    { 
     // Do Something 
    }  
    }  

    public void SomeMethod2()  
    {  
    // Do Something 
    } 

    public void SomeMethod3()  
    {  
    lock(obj) 
    { 
     // Do Something 
    }  
    } 
    .        
    .        
    .          
}  

Как пройти статический только для чтения экземпляр типа Object при регистрации класса реализации с типом IInterface через единицу конфигурации?

+0

* "static readonly instance" * - Вы имеете в виду одноэлемент? В этом случае посмотрите [этот возможный дублирующий вопрос] (http://stackoverflow.com/questions/16835728/unity-singleton-code). – GolezTrol

+0

Я хочу сделать это через файл конфигурации (& not code), а также я не хочу иметь экземпляр singleton класса реализации, но, скорее, при регистрации класса с единством я хочу передать ему статический экземпляр readonly типа Object (т.е. что-то похожее на «static readonly obj = new Object()», а затем передают obj как значение параметра конструктору класса реализации) –

+0

Как бы вы определили «статический readonly»? –

ответ

0

Мой предпочтительный подход, вероятно, создать фабрику для создания IInterface s

public interface IInterface 
{ 
    void SomeMethod1(); 
} 

public interface IInterfaceFactory 
{ 
    IInterface CreateInterface(); 
} 

public class StandardInterfaceFactory : IInterfaceFactory 
{ 
    // Define your static lock object here. Other customers 
    // can define their own IInterfaceFactory to use a 
    // different lock object. 
    private static readonly object lockObject = new object(); 

    public IInterface CreateInterface() 
    { 
     return new StandardInterface(lockObject); 
    } 
} 

public class StandardInterface : IInterface 
{ 
    private readonly object lockObject; 

    public StandardInterface(object lockObject) 
    { 
     this.lockObject = lockObject; 
    } 

    public void SomeMethod1() 
    { 
     lock (this.lockObject) 
     { 
      Console.WriteLine("I've locked on " + lockObject); 
     } 
    } 
} 

Конфигурация единство и клиентский код будет выглядеть следующим образом.

void Main() 
{ 
    IUnityContainer container = new UnityContainer(); 

    // This mapping can be done trivially in XML configuration. 
    // Left as an exercise for the reader :) 
    container.RegisterType<IInterfaceFactory, StandardInterfaceFactory>(); 

    IInterfaceFactory factory = container.Resolve<IInterfaceFactory>(); 

    IInterface myInterface = factory.CreateInterface(); 

    myInterface.SomeMethod1(); 
}