Как использовать Microsoft Unity в таком случае?

#unity-container #sybase-asa

#unity-контейнер #sybase-asa

Вопрос:

Предположим, у меня есть интерфейс IBookRepository, реализованный SybaseAsaBookRepository и XMLBookRepository.

Конструктор sybase asabookrepository требует 2 параметра, идентификатор пользователя базы данных и пароль, оба значения могут быть получены экземпляром IBookAppConfiguration. Конструктору XMLBookRepository параметр не нужен.

По-видимому, IBookAppConfiguration можно легко настроить для повторного использования Microsoft Unity, давайте даже предположим, что это синглтон.

Теперь, как я мог бы настроить Microsoft Unity, чтобы разрешить интерфейс IBookRepository для SybaseAsaBookRepository при правильном использовании требуемых 2 параметров конструктора?

Примеры кодов приведены ниже:

 public interface IBookRepository
{
    /// <summary>
    /// Open data source from Sybase ASA .db file, or an .XML file
    /// </summary>
    /// <param name="fileName">Full path of Sybase ASA .db file or .xml file</param>
    void OpenDataSource(string fileName);

    string[] GetAllBookNames(); // just return all book names in an array
}

public interface IBookAppConfiguration
{
    string GetUserID();   // assuming these values can only be determined 
    string GetPassword(); // during runtime
}

public class SybaseAsaBookRepository : IBookRepository
{
    public DatabaseAccess(string userID, string userPassword)
    {
        //...
    }
}

<register type="IBookAppConfiguration" mapTo="BookAppConfigurationImplementation">
    <lifetime type="singleton"/>
</register>

<register name="SybaseAsa" type="IBookRepository" mapTo="SybaseAsaBookRepository"> 
    <constructor> 
        <param name="userID" value="??? what shall i put it here???"/> 
        <param name="userPassword" value="??? what shall i put it here???"/> 
    </constructor> 
</register>
  

Ответ №1:

Вы можете изменить список параметров sybase asabookrepository, чтобы принять экземпляр IBookAppConfiguration:

 public class SybaseAsaBookRepository : IBookRepository
{
    public SybaseAsaBookRepository(IBookAppConfiguration configuration)
    {
        string userID = configuration.GetUserID();
        string userPassword = configuration.GetPassword();
        ...
    }
}
  

Ваша регистрация должна быть:

 <register name="SybaseAsa" type="IBookRepository" mapTo="SybaseAsaBookRepository" /> 
  

Это можно использовать, потому что Unity знает

Комментарии:

1. Привет, PVitt, спасибо за ваш ответ, проблема в том, что идентификатор пользователя и пароль не могут быть жестко запрограммированы, их необходимо извлечь из IBookAppConfiguration.

2. да, возможен явный вызов .. но можно ли настроить логику в unity.config?