Не используйте статическое поле в контроллере для хранения ваших слов.Не рекомендуется сохранять состояние в контроллере, поскольку, как указано в другом ответе, контроллер равен transient
, и для каждого запроса создается новый.Таким образом, даже если ваша статическая переменная все еще должна быть доступна, хранить ее с контроллером не очень хорошо.Также вы хотите сохранить свою модель в чистоте, то есть не вкладывать в нее какую-либо бизнес / игровую логику.Используйте другой класс для этого.Используйте модель только для проверки правильности значений, т. Е. Минимальной длины, требуемой и т. Д.
Лучшим решением для вашей проблемы будет создание службы singleton
для хранения данных.Как одиночный, только один сервис будет создан за время жизни вашего приложения.Вы можете использовать Dependency Injection, чтобы внедрить его в свой контроллер и использовать его для каждого запроса, зная, что это будет один и тот же экземпляр службы для каждого запроса.
Например:
public interface IWordService
{
IEnumerable<String> Words { get; }
bool WordWasNotSubmittedPreviously(string word);
bool WordMatchesLettersInLongWord(string longWord, string containedWordCandidate);
void AddWordToList(string word);
}
public class WordService : IWordService
{
private List<string> _words;
public IEnumerable<string> Words => _words;
public WordService()
{
_words = new List<string>();
}
public bool WordWasNotSubmittedPreviously(string containedWordCandidate) => !_words.Contains(containedWordCandidate);
public bool WordMatchesLettersInLongWord(string longWord, string containedWordCandidate)
{
if (string.IsNullOrWhiteSpace(containedWordCandidate)) return false;
return containedWordCandidate.All(letter => longWord.Contains(letter));
}
public void AddWordToList(string word)
{
_words.Add(word);
}
}
Этот сервис выполняет всю работу, которую выполнял ваш ValidationAttribute
, но мы можем использовать Dependency Injection, чтобы убедиться, что мы создаем только один для всего приложения.
В вас Startup.cs
добавьте это к методу ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IWordService, WordService>();
....
}
Теперь мы можем внедрить это в наш контроллер и, поскольку мы зарегистрировали его как singleton
, мы будем получать один и тот же экземпляр каждый раз, даже если мы получим другой экземпляр контроллера:
public class HomeController : Controller
{
private readonly IWordService _wordService;
public HomeController(IWordService wordService)
{
_wordService = wordService;
}
[HttpPost]
public IActionResult Index(WordGameModel incomingModel)
{
if (ModelState.IsValid)
{
// Use the `_wordService instance to perform your checks and validation
...
}
...
}
}
Я оставил фактическое использование _wordService
для реализации :-), но это должно быть довольно просто.
Вы можете прочитать больше о Dependency Injection (DI) здесь
А также метод ConfigureServices
здесь