Разрешить/зарегистрировать универсальный объект по строковому значению в Виндзоре

#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.