首页 > 解决方案 > 直接从类更新模型中的数据

问题描述

我正在制作一个简单的游戏作为基于随机事件的练习项目,以便更容易添加新事件我决定使用关键字系统,其中每个事件都获得分配给它们的关键字,然后用于处理事件,这可以像显示消息、更改模型中的数据或在随机表上再次滚动一样简单。

我有一个随机决定事件并返回带有关键字的字符串列表的类。

我想创建一个类,其中所有关键字都存储为方法,然后可以使用列表调用。

像这样的东西:

class Keyword
{
    public void InputKeywords(List<string> Ikeywords)
    {
        foreach (var item in Ikeywords)
        {
            switch (item)
            {
                case "keyword0":
                    keyword0();
                    break;
                case "keyword1":
                    keyword0();
                    break;
                case "keyword2":
                    keyword0();
                    break;
            }
        }
    }

    private void keyword0()
    {
        //do something
    }

    private void keyword1()
    {
        //do something
    }

    private void keyword2()
    {
        //do something
    }
}

现在我面临的问题是从关键字类更新模型中的数据。因为事件是随机选择的,所以我不知道每个事件将哪些数据发送给类以使其更新。

我自己想出的解决方案:

我觉得我错过了这样做的“正确”方式。什么是“最佳”方法?

标签: c#mvvmmvvmcross

解决方案


首先,关键字类的命名在这里让人感到误导。它基本上是一个事件处理程序,所以我也将它命名为(例如 RandomEventGenerator)

对于您的问题,我也不建议您使用静态模型。你的可测试性会受到影响,因为你不会在那里使用依赖注入。话虽这么说,您的第二种方法似乎朝着正确的方向发展。我建议使用注入 EventInvoker 接口。

public interface IEventInvoker
{
    public void RaiseEvent();
}

这可以在操作员中实现,该操作员可以访问您的数据模型并具有预定义的操作来修改您的数据。

public class WeatherOperator : IEventInvoker
{
    private readonly WeatherEngine _weatherEngine;

    public WeatherOperator(WeatherEngine weatherEngine)
    {
        _weatherEngine = weatherEngine;
    }
    public void RaiseEvent()
    {
        StartSunshine();
    }

    public void StartSunshine()
    {
        _weatherEngine.RemoveClouds();
        _weatherEngine.SetSunPosition(DayTimes.Noon);
    }

    public void LetItRain()
    {
        _weatherEngine.SetCloudes(CloudModes.FullCover);
        _weatherEngine.SetRain(RainIntesity.Medium);
    }
}

有了 IEventInvoker 的列表,您就可以转到您的 EventHandler。

public class RandomEventGenerator
{
    private readonly List<IEventInvoker> _eventInvoker;
    private readonly Dictionary<string, Action> _eventDictionary;

    public RandomEventGenerator(List<IEventInvoker> eventOperator, List<string> keywords)
    {
        _eventInvoker = eventOperator;
        _eventDictionary = RegisterKeywordsToRandomEvents(keywords);
    }

    private Dictionary<string,Action> RegisterKeywordsToRandomEvents(List<string> keywords)
    {
        var eventDictionary = new Dictionary<string, Action>();
        foreach (var keyword in keywords)
        {
            var random = new Random();
            var index = random.Next(_eventInvoker.Count);
            eventDictionary.Add(keyword,_eventInvoker[index].RaiseEvent);
        }

        return eventDictionary;
    }

    public void EventByKeyword(string Keyword)
    {
        _eventDictionary[Keyword].Invoke();
    }

    public void RandomEvent()
    {
        var random = new Random();
        var index = random.Next(_eventInvoker.Count);
        _eventInvoker[index].RaiseEvent();
    }
}

请注意,为了保持小,我没有在这里使用空检查或输入验证,这是强烈推荐的。使用这种方法,您的模型/数据和视图模型/数据访问器之间有一个清晰的界限。


推荐阅读