我正在开发一个Xamarin iOS项目,但我想这个问题适用于任何c#项目,而不是Xamarin特有的。我正在开发一个基于iPad的kiosk应用程序,店主在早上登录,然后用户可以注册并订购全天的产品。
当店主在早上登录时,我调用一个REST API来收集当天的配置信息。例如,它会说哪些产品应该被推荐等等。API调用填充一个名为DailySetting
的对象。
当用户与iPad交互时,我们会经历许多屏幕,并不总是以相同的顺序,每个屏幕都有自己的viewcontroller。每个屏幕设置UserInteraction
对象的不同属性,然后通过POST请求发送回服务器。
我的问题是我在哪里/如何存储DailySetting
和UserInteraction
对象?我看到我有一些选项:
- 将它们作为属性存储在然后每次需要引用对象时,循环通过风险投资,直到我找到根,然后进入公众财产。这看起来很浪费,不太合乎逻辑。
- 将对象的/properties设置为静态,因为只有一个在使用在任何时候。如果我没理解错的话,它们可能是垃圾收集,因为他们不会设置任何东西,所以可能不是最好的方法。
- 将数据存储在sql数据库中,并在每次执行时调用该数据库的变化。这似乎有点过头了,只是引用当前对象。 对于DailySetting对象,将其保存在应用程序设置中,但是这是临时设置的最佳地点吗?
- 另一个比我能想到的更好的方法…
必须有一个正确的地方,我可以附加当前使用的对象,然后从不同的类/ViewControllers等引用它们
有许多不同的方法和哲学来处理这个问题。主要概念有:DailySetting
的单例实例或依赖注入。
单例模式:
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
调用Singleton。实例。
另一种方法是将DailySettings
对象注入每个ViewController。
我所做的是在我的AppDelegate中保存一个实例,并通过构造函数将AppDelegate本身传递给每个视图控制器。
使用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。这将为您节省大量时间,因为您可以省略专门向接口注册大量类。
- 扫描n层架构中的多个类库。
- 使用默认约定将接口自动映射到类。
- 与MVC控制器一起工作
将记录器类注册为单例:
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/
注意structuremap不一定要在MVC中使用。您可以在任何c#应用程序中使用它。