Вы можете использовать Command шаблон проектирования, изменив некоторую часть вашего кода. Здесь вы можете иметь два типа команд. 1-й для вашей проверки и 2-й для сохранения файла. Таким образом, зарегистрировав их в качестве команды, вы можете вызвать их всех в одном месте. Вы можете использовать класс .NET Action
в качестве команды и использовать его в классе CommandHandler
:
Итак, если у вас есть такой класс обработчика команд:
public class CommandsHandler
{
private List<Action> Commands { get; set; }
public void AddCommand(Action saver)
{
Commands.Add(saver);
}
public void ExecuteAll()
{
Commands.ForEach(c => c.Invoke());
}
}
Затем измените ваши классы статей, чтобы получить обработчик команд. Обратите внимание, что каждый суперкласс отвечает за регистрацию методов проверки, чтобы предотвратить повторную регистрацию у детей:
public abstract class ArticleFile
{
protected IFormFile FileForm;
protected string FileFullPath;
public abstract void CheckFileRules();
public void SaveFile(){
protected ArticleFile(CommandsHandler validator, CommandsHandler saver, IFormFile file, string path)
{
FileForm = file;
FileFullPath = path;
validator.AddCommand(CheckFileRules);
saver.AddCommand(SaveFile);
}
}
public abstract class ArticleImage : ArticleFile
{
public abstract void CheckImageRules();
protected ArticleImage(CommandsHandler validator, CommandsHandler saver, IFormFile file, string path)
: base(validator, saver, file, path)
{
validator.AddCommand(CheckImageRules);
}
}
public class ArticleVideo : ArticleFile
{
public override void CheckFileRules() {/*CHECK STH*/ }
public void CheckVideoRules() {/*CHECK STH*/ }
public ArticleVideo(CommandsHandler validator, CommandsHandler saver, IFormFile file, string path)
: base(validator, saver, file, path)
{
validator.AddCommand(CheckVideoRules);
}
}
public class ArticleMainImage : ArticleImage
{
public ArticleMainImage(CommandsHandler validator, CommandsHandler saver, IFormFile file, string path)
: base(validator, saver, file, path)
{
validator.AddCommand(CheckImageDimensions);
}
public override void CheckFileRules() {/*CHECK STH*/}
public override void CheckImageRules() {/*CHECK STH*/}
public void CheckImageDimensions() { }
}
Тогда вы можете легко создавать свои объекты и вызывать валидаторы и заставки:
public class Article : IArticleService
{
public void AddArticle(ArticleDto articleDto)
{
var articleValidator = new CommandsHandler();
var articleFileSaver = new CommandsHandler();
var articleMainImage = new ArticleMainImage(articleValidator, articleFileSaver, articleDto.MainImage, "");
var articleVideos = new List<ArticleVideo>();
articleDto.Videos.ForEach(v =>
articleVideos.Add(new ArticleVideo(articleValidator, articleFileSaver, v, "")));
articleValidator.ExecuteAll();
articleFileSaver.ExecuteAll();
}
}