Рассмотрим следующий код:
public interface IFileBackup
{
Task Backup(byte[] file);
}
public class BackUpMechanismA : IFileBackup
{
//Implementation
public async Task Backup(byte[] file)
{
//Attempts to backup using mechanism A
}
}
public class BackUpMechanismB : IFileBackup
{
//Implementation
public async Task Backup(byte[] file)
{
//Attempts to backup using mechanism B
}
}
Тогда вызывающий класс выглядит следующим образом:
public class Caller
{
private readonly IFileBackup _backupA;
private readonly IFileBackup _backupB;
public Caller(IFileBackup backupA, IFileBackup backupB)
{
_backupA = backupA;
_backupB = backupB;
}
public async Task BackupFile(byte[] file)
{
try
{
await _backupA.Backup(file);
}
catch(SomeException)
{
await _backupB.Backup(file);
}
}
}
Так что я пытаюсь здесь сделать, это использовать полиморфизм.Таким образом, BackupMechanismA
и BackupMechanismB
реализуют метод Backup
по-своему.В вызывающей программе я хочу попробовать первый механизм, и если он не работает, мы ловим исключение и пробуем второй подход.
У меня проблемы с разрешением правильных реализаций с использованием Autofac
.Я попытался с:
builder.RegisterType<BackupMechanismA>().As<IFileBackup>().AsSelf();
builder.RegisterType<BackupMechanismB>().As<IFileBackUp>().AsSelf();
Но это не сработает, потому что мне все еще нужно сказать вызывающей стороне, какой из типов разрешить.Как мне это сделать в вызывающей программе?
Кроме того, я сомневаюсь, действительно ли этот дизайн подходит для этого.До этого проекта у меня был только один класс с двумя разными методами, один для механизма A и один для механизма B, а затем вызывающая сторона просто вызывала различные методы в try catch.Поэтому я хотел реорганизовать это, потому что класс стал довольно большим, и я хотел разделить два разных механизма на их собственные классы.
Итак, могу ли я решить эту проблему с помощью Autofac?И это правильный дизайн для этого сценария?