Как зарегистрировать несколько реализаций одного и того же интерфейса с разными зависимостямиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как зарегистрировать несколько реализаций одного и того же интерфейса с разными зависимостями

Сообщение Anonymous »

Предположим, у меня есть несколько реализаций интерфейса. Каждая реализация имеет свои собственные зависимости. Как мы можем получить правильный? Правильная реализация должна быть выбрана во время выполнения. Во время выполнения необходимо установить некоторые свойства.
Теперь у нас есть следующее, работающее с AutoFac, но в новом проекте мы его больше не используем. Теперь мы не можем заставить UploaderFactory работать.
Если у кого-то есть лучшее решение, дайте мне знать!
// Interface with multiple implementations
public interface IFileUploader
{
Task UploadAsync(string filePath);
}

// Dependency interface for a particular implementation
public interface IDependencyA
{
}

// Dependency interface for another implementation
public interface IAnotherDependency
{
}

public class FileUploaderA: IFileUploader
{
public delegate FileUploaderA Factory(SomeStuff properties);

private readonly SomeStuff _properties;
private readonly IDependencyA _dependencyA;

public FileUploaderA(SomeStuff properties, IDependencyA dependencyA)
{
_properties = properties;
_dependencyA = dependencyA;
}

public Task UploadAsync(string filePath)
{
// Upload file and use properties and dependencies
throw new NotImplementedException();
}
}

public class FileUploaderB : IFileUploader
{
public delegate FileUploaderB Factory(SomeStuff properties);

private readonly SomeStuff _properties;
private readonly IAnotherDependency _anotherDependency;

public FileUploaderB(SomeStuff properties, IAnotherDependency anotherDependency)
{
_properties = properties;
_anotherDependency = anotherDependency;
}

public Task UploadAsync(string filePath)
{
// Upload file and use properties and dependencies
throw new NotImplementedException();
}
}

public interface IUploaderFactory
{
IFileUploader Create(bool condition, SomeStuff someStuff);
}

public class UploaderFactory : IUploaderFactory
{
private readonly FileUploaderA.Factory _fileUploaderA;
private readonly FileUploaderB.Factory _fileUploaderB;

// This injection doesn't work!!!
public UploaderFactory(FileUploaderA.Factory fileUploaderA, FileUploaderB.Factory fileUploaderB)
{
_fileUploaderA = fileUploaderA;
_fileUploaderB = fileUploaderB;
}

public IFileUploader Create(bool condition, SomeStuff someStuff)
{
if (condition == true)
{
// Get File uploader A
return _fileUploaderA(someStuff);
}
else
{
// Get File uploader B
return _fileUploaderB(someStuff);
}
}
}

public class SomeStuff()
{
public string A { get; set; }

public string B { get; set; }
}


Подробнее здесь: https://stackoverflow.com/questions/789 ... fferent-de
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»