I'm looking to create a very simple web service that randomly generates data for two data points and makes that data accessible via a web service. I decided to give it a try using ASP.NET Web API.
Here is my DataGenerator class:
public class DataGenerator
{
private Random rand;
private Double range;
private Double sample;
private Double scaled;
public DataGenerator(string name, string units, double min, double max, int updateRate)
{
try
{
Name = name;
Units = units;
Min = min;
Max = max;
UpdateRate = updateRate;
Timer timer = new Timer();
timer.Interval = updateRate;
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Start();
rand = new Random();
range = max - min;
Debug.WriteLine("Instantiated");
}
catch (Exception ex)
{
Debug.WriteLine("Error in Data Generator: " + ex.Message);
}
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
try
{
range = Max - Min;
sample = rand.NextDouble();
scaled = (sample * range) + Min;
Value = scaled;
Debug.WriteLine("Value = " + Value);
}
catch (Exception ex)
{
Debug.WriteLine("Error in Data Generator: " + ex.Message);
}
}
public string Name { get; }
public string Units { get; }
public double Min { get; set; }
public double Max { get; set; }
public int UpdateRate { get; set; }
public double Value { get; private set; }
}
Here is my ApiController class that instantiates two DataGenerator objects:
public class DataGeneratorsController : ApiController
{
DataGenerator[] generators;
public DataGeneratorsController()
{
generators = new DataGenerator[]
{
new DataGenerator("Temperature", "deg F", 0.0, 200.0, 1000),
new DataGenerator("Pressure", "psi", 0.0, 100.0, 1000)
};
}
public IEnumerable<DataGenerator> GetAllDataGenerators()
{
Debug.WriteLine("Temp = " + generators[0].Value.ToString() + " Pressure = " + generators[1].Value.ToString());
return generators;
}
}
In debug mode I'm able to see the data generating just fine in the DataGenerator class, but it is always showing up as 0 in the ApiController class, which I found out is because it is getting re-instantiated each time a request is made from the browser.
How do I get around this? I don't get why the constructor would be called each time. I found a lot of stuff online about dependency injection but I don't see how that explains my problem.
I might be missing something very obvious here as I'm new to both C# and Web API.