我正在开发一个Xamarin iOS项目,但我想这个问题适用于任何C#项目,而不是特定于Xamarin。我正在开发一个基于iPad的自助服务终端应用程序,店主在早上登录,然后用户可以全天注册和订购产品。
当店主在早上登录时,我会进行REST API调用,收集当天的配置信息。例如,它会说明哪些产品应该是特色等.API调用会填充一个名为DailySetting
的对象。
当用户与iPad交互时,我们会经历多个屏幕,而不是总是以相同的顺序,每个屏幕都有自己的ViewControllers。每个屏幕设置UserInteraction
对象的不同属性,然后通过POST请求将其发送回服务器。
我的问题是在哪里/如何存储DailySetting
和UserInteraction
个对象?我看到我有一些选择:
必须有一个正确的位置,我可以附加当前正在使用的对象,然后从不同的类/ ViewControllers等引用它们。
答案 0 :(得分:1)
有许多不同的方法和哲学可以解决这个问题。
主要概念是:
DailySetting
或依赖注入的单例实例。
单身人士模式:
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
每次对象都调用Singleton.Instance。
另一种方法是将DailySettings
对象注入每个ViewController。
我所做的是在AppDelegate中保存一个实例,并通过构造函数将AppDelegate本身传递到每个viewcontroller中。
答案 1 :(得分:0)
使用像Structuremap这样的依赖注入系统。您可以将对象的实例声明为单例,然后可以在类之间共享它们。
注册很简单:
For<IYourInterface>().Use<YourClass>().Singleton();
然后在你的mvc控制器中创建一个接受接口的构造函数:
public Homecontroller(IYourInterface instance) {
// you now have access to your class here.
// it's declared as a singleton so it can be shared between controllers.
}
我建议使用结构图,因为它有一种通过识别命名约定自动将IYourClass映射到YourClass的好方法。这将为您节省大量时间,因为您可以省略专门向接口注册类的负载。
此示例显示如何:
将记录器类注册为单例:
public class DefaultRegistry : Registry
{
var lgr = new Logger("filepath or whatever...");
public DefaultRegistry()
{
Scan(
scan =>
{
scan.Assembly("YourApp.Data");
scan.Assembly("YourApp.Domain");
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
For<ILogger>().Use(lgr).Singleton();
}
}
Structuemap还有很好的指南可以帮助您入门:http://structuremap.github.io/quickstart/
请注意,不必在MVC中使用structuremap。您可以在任何C#应用程序中使用它。