Здравствуйте, возможно неточно сформулировал вопрос, попытаюсь описать в коде.
public class XmlSerializeTableRecRepository : ITrainTableRecRepository
{
public XmlSerializeTableRecRepository(string connection)
{
}
//Members...
}
public interface ITrainTableRecRepository : IGenericDataRepository<TrainTableRec>
{
}
/// <summary>
/// регистрируем сопоставление типов
/// </summary>
private static void RegisterType(ContainerBuilder builder)
{
builder.RegisterType<XmlSerializeTableRecRepository>().As<ITrainTableRecRepository>()
.WithParameters(new List<Parameter> { new NamedParameter("connection", @"TrainTableMain.xml") });
}
Нужно внедрить зависимость от репозитория (IGenericDataRepository). таблица хранится в XML файлах, непосредственная реализация репозитория работает с данными через сериализацию, но возможны другие типы хранилища, для этого и есть ITrainTableRecRepository.
Пока данные хранились в 1 XML файле ("TrainTableMain.xml"), все работало как по учебнику). Но понадобилось параллельно через удаленный HTTP сервис получать данные и складывать их в репозиторий, только в другой ("TrainTableRemoute.xml").
Т.е. нужно чтобы DI создал объекты так для удаленного сервиса:
var rep= new XmlSerializeTableRecRepository("TrainTableRemoute.xml");
для локального сервиса:
var rep= new XmlSerializeTableRecRepository("TrainTableMain.xml");
Но как мне зарегистрировать типы для такого соответствия, если 1 раз уже заданно `ITrainTableRecRepository -> XmlSerializeTableRecRepository("TrainTableMain.xml")?
Или это нарущает основы работы контейнера и придется делать фейковый тип для второго объекта?
Или просто передавать строку подключения через public свойство в сам репозиторий, после его создания через DI?
Используйте именованные сервисы:
builder.RegisterType<XmlSerializeTableRecRepository>()
.Named<ITrainTableRecRepository>("Main")
.WithParameter("connection", "TrainTableMain.xml");
builder.RegisterType<XmlSerializeTableRecRepository>()
.Named<ITrainTableRecRepository>("Remote")
.WithParameter("connection", "TrainTableRemote.xml");
Но магии, конечно же, не получится: для всех кто использует этот репозиторий вам придется явно указывать какой из репозиториев ему нужен:
builder.RegisterType<Foo>()
.WithParameter(new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ITrainTableRecRepository),
(pi, ctx) => ctx.ResolveNamed<ITrainTableRecRepository>("Remote")
));
Извиняюсь что не понял ответ Pavel Mayorov, сделал вот так.
//REGISTER
builder.RegisterType<XmlSerializeTableRecRepository>().Named<ITrainTableRecRepository>("Local")
.WithParameters(new List<Parameter> { new NamedParameter("connection", @"TrainTableMain.xml") });
builder.RegisterType<XmlSerializeTableRecRepository>().Named<ITrainTableRecRepository>("RemoteCis")
.WithParameters(new List<Parameter> { new NamedParameter("connection", @"TrainTableRemoteCis.xml") });
//RESOLVE
using (var scope = AutofacConfig.Container.BeginLifetimeScope())
{
var repResolve = scope.ResolveNamed<ITrainTableRecRepository>("Local");
var repResolve2 = scope.ResolveNamed<ITrainTableRecRepository>("RemoteCis");
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Здравствуйте! Вопрос такой - в своём приложении использую, например, класс подразделения (Department), у которого есть вложенная коллекция сотрудников...
Переношу проект с# window в monodevelopНо выходит ошибка при компиляции ошибка создания целевого объекта LinkEmbeddableAssemblies: