#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?