Как отсоединить Генератор паролей?Поэтому мне не нужно переходить на него, и я могу вместо этого ввести интерфейс, который будет использоваться IoC Container?
1-й - Получить интерфейс:
public class IPasswordRequirements
{
int MaxLength { get; }
int NoUpper { get; }
int NoLower { get; }
int NoNumeric { get; }
int NoSpecial { get; }
}
2-й- Наследовать от интерфейса:
public class PasswordRequirements : IPasswordRequirements
{
public int MaxLength { get; set; }
public int NoUpper { get; set; }
public int NoLower { get; set; }
public int NoNumeric { get; set; }
public int NoSpecial { get; set; }
}
3-й - Конструктор обновлений:
public class PasswordGenerator : IPasswordGenerator
{
public PasswordGenerator(IPasswordRequirements passwordRequirements)
{
}
Вот и все.
Не используйте репозиторий здесь
Я боюсь, что ваше понимание хранилища и DI выводит некоторое время требования, которое всегда должно использоваться вместе.Я считаю, что вам не хватает кода, который создает зависимости.Хотя репозиторий в своей основе может предусматривать, что в качестве основы его шаблона он не является правильным выбором по двум причинам;во-первых, вы не храните элементы в хранилище (то есть нет виртуальной или физической абстракции уровня, чтобы обернуть хранилище), а во-вторых, вы не предоставляете общий доступ к широкому спектру типов, кроме одного.
По своей сути, единственное, что может понадобиться хранилищу - это конфигурация / объект для передачи объектов ... на какой-то другой уровень (SQL, Файловая система, Web API).Хранилище не обязательно во всех случаях знать что-либо о том, как создаются объекты.
Выберите структуру, которая соответствует вашим потребностям
Вместо этого вам нужна структурапостроенный на его ядре вокруг DI;создание и удаление объектов, а также наличие интерфейса / конфигурации для конфигурирования инфраструктуры, чтобы он мог знать зависимости, помогающие в создании зависимых объектов.На ум приходят три AutoFac , Ninject и Unity .В каждом из этих случаев вы в некотором роде обязаны настраивать каждый тип и использовать его шаблон для создания объектов.Во многих случаях эти Frameworks могут даже быть полнофункциональными заменами на другие Microsoft Frameworks (например, MVC имеет свой собственный способ создания объектов, но может быть заменен другими DI Frameworks).Эти платформы никоим образом не должны знать конфигурацию о том, как передавать эти объекты на другие уровни.Это может быть сделано просто путем конфигурации в качестве побочного продукта, но по своей сути это не то, что настроено.
Например, с помощью Autofac, сначала вы создаете компоновщик, который в основном является причудливым способом создания конфигурации:
var builder = new ContainerBuilder()
Затем вы регистрируете свои типы:
builder.RegisterType<PasswordRequirements>.As<IPasswordRequirements>();
Создаете Контейнер , который управляет объектами: от их реализации до их конфигурации.
var container = builder.Build();
Создайте область, которая определяет продолжительность жизни объектов.
using (var scope = new BeginLifetimeScope())
{
// all objects created by scope which be disposed when the scope is diposed.
var passwordRequirements = scope.Resolve<IPasswordRequirements>();
}
По умолчанию passwordRequirements
будет new PasswordRequirements()
.Оттуда вы просто строите необходимые требования к зависимости и позволяете фреймворку обрабатывать все остальное.