Я буквально только начал использовать библиотеку Injection Blocks Dependency Injection от Microsoft, и я расстался.
Это мой класс IoC, который будет обрабатывать экземпляры моих конкретных классов для их типов интерфейсов (поэтому мне не нужно постоянно вызывать Resolve в контейнере IoC каждый раз, когда я хочу репозиторий в своем контроллере):
public class IoC
{
public static void Intialise(UnityConfigurationSection section, string connectionString)
{
_connectionString = connectionString;
_container = new UnityContainer();
section.Configure(_container);
}
private static IUnityContainer _container;
private static string _connectionString;
public static IMovementRepository MovementRepository
{
get { return _container.Resolve<IMovementRepository>(); }
}
}
Итак, идея в том, что из моего контроллера я могу просто сделать следующее:
_repository = IoC.MovementRepository;
В настоящее время я получаю сообщение об ошибке:
Исключение: InvalidOperationException - тип Строка не может быть построена. Вы должны сконфигурируйте контейнер для поставки значение.
Теперь я предполагаю, что это связано с тем, что для моей конкретной реализации конкретной версии требуется один строковый параметр для своего конструктора. Конкретный класс выглядит следующим образом:
public sealed class MovementRepository : Repository, IMovementRepository
{
public MovementRepository(string connectionString) : base(connectionString) { }
}
Наследуется от:
public abstract class Repository
{
public Repository(string connectionString)
{
_connectionString = connectionString;
}
public virtual string ConnectionString
{
get { return _connectionString; }
}
private readonly string _connectionString;
}
Теперь, правильно ли я делаю это? Должен ли я иметь конструктор в моей конкретной реализации слабосвязанного типа? То есть должен ли я удалить конструктор и просто сделать свойство ConnectionString Get/Set, чтобы я мог сделать следующее:
public static IMovementRepository MovementRepository
{
get
{
return _container.Resolve<IMovementRepository>(
new ParameterOverrides
{
{
"ConnectionString", _connectionString
}
}.OnType<IMovementRepository>() );
}
}
Итак, я в основном хочу знать, как правильно получить строку подключения к вашему конкретному типу, которая соответствует правилам IoC, и держит мой контроллер и конкретные репозитории свободными, поэтому я могу легко изменить DataSource на более позднюю дату.
РЕДАКТИРОВАТЬ 09:52:
Просто повторить, что мне нужно. Я хочу знать правильный способ передать объект ConnectionString или объект IRepositoryConfiguration (предпочитайте эту идею, спасибо Mc) конкретному классу из Unity. Я не слишком суетился о том, что я прохожу, как я передаю его, сохраняя свободную связь.