#c# #.net #dependency-injection #castle-windsor
#c# #.net #инъекция зависимости #замок-Виндзор
Вопрос:
У меня есть интерфейс IImportCommandlt;Tgt;
public interface IImportCommandlt;Tgt; where T : ImportModelBase { DateTime Date { get; set; } Listlt;Tgt; Items { get; set; } }
реализованный объект ImportEntityCommandlt;Tgt;
public class ImportEntityCommandlt;Tgt; : ICommand, IImportCommandlt;Tgt; where T : ImportModelBase { public DateTime Date { get; set; } public Listlt;Tgt; Items { get; set; } }
и некоторые модели из ImportModelBase
UserImportModel : ImportModelBase PersonImportModel : ImportModelBase
и для ImportEntityCommand
ImportUserCommand : ImportEntityCommandlt;UserImportModelgt; ImportPersonCommand: ImportEntityCommandlt;PersonImportModelgt;
и т.д.
Чтобы создать команду ImportEntityCommand, я хочу сделать что-то подобное, когда строковый параметр «пользователь»
new ImportUserCommand() { Date = body.Date.ToUniversalTime(), Items = body.Data.Select(d =gt; d.ToObjectlt;UserImportModelgt;()).ToList() }
и когда «человек», то
new ImportPersonCommand() { Date = body.Date.ToUniversalTime(), Items = body.Data.Select(d =gt; d.ToObjectlt;PersonImportModelgt;()).ToList() }
body
является json из запроса.
Можно ли зарегистрировать мой интерфейс и сущности на основе входных строк для создания нужного объекта команды?
Самым простым решением было бы сделать это с помощью оператора switch, но мне хотелось бы чего-то более элегантного.
Ответ №1:
Команды не должны регистрироваться с помощью внедрения зависимостей, но вы можете зарегистрировать a Factory
, который создает команды на основе входных строк.
Одним из способов сделать это без использования операторов switch было бы добавить заводские методы во внутренний Dictionary
, где ключом является строка ввода.
Может быть, что-то подобное могло бы помочь вам начать;
Фабрика (зарегистрирована в DI)
public interface ICommandFactory { ICommand Create(string type, DateTime dateTime, string json); } public class CommandFactory : ICommandFactory { private readonly Dictionarylt;string, Funclt;DateTime, string, ICommandgt;gt; _dictionary = new () { { "user", (dateTime, json) =gt; new ImportUserCommand(dateTime, json) }, { "person", (dateTime, json) =gt; new ImportPersonCommand(dateTime, json) } }; public ICommand Create(string type, DateTime dateTime, string json) =gt; _dictionary[type](dateTime, json); }
Команды и модели (не зарегистрированы)
public interface ICommand { DateTime Date { get; set; } } public class Commandlt;Tgt; : ICommand { protected Command(DateTime dateTime, string json) { /* Set data from json */ } public DateTime Date { get; set; } public Listlt;Tgt; Items { get; set; } } public class ImportUserCommand : Commandlt;UserImportModelgt; { public ImportUserCommand(DateTime dateTime, string json) : base(dateTime, json) { } } public class ImportPersonCommand : Commandlt;PersonImportModelgt; { public ImportPersonCommand(DateTime dateTime, string json) : base(dateTime, json) { } } public class UserImportModel { } public class PersonImportModel { }
Комментарии:
1. что ж, вы правы… это более эффективный способ решить мою «проблему». thx.