C# 将对象链接到何处,以便在多个类中引用它们

C# 将对象链接到何处,以便在多个类中引用它们,c#,xamarin.ios,C#,Xamarin.ios,我正在开发一个Xamarin iOS项目,但我想这个问题适用于任何C#项目,并且不是Xamarin特有的。我正在开发一个基于iPad的信息亭应用程序,店主可以在早上登录,然后用户可以注册并订购一整天的产品 当店主早上登录时,我会调用RESTAPI,收集当天的配置信息。例如,它将说明哪些产品应具有特色等。API调用填充名为DailySetting的对象 当用户与iPad交互时,我们会浏览许多屏幕,但顺序并不总是一样,每个屏幕都有自己的ViewController。每个屏幕设置用户交互对象的不同属性

我正在开发一个Xamarin iOS项目,但我想这个问题适用于任何C#项目,并且不是Xamarin特有的。我正在开发一个基于iPad的信息亭应用程序,店主可以在早上登录,然后用户可以注册并订购一整天的产品

当店主早上登录时,我会调用RESTAPI,收集当天的配置信息。例如,它将说明哪些产品应具有特色等。API调用填充名为
DailySetting
的对象

当用户与iPad交互时,我们会浏览许多屏幕,但顺序并不总是一样,每个屏幕都有自己的ViewController。每个屏幕设置
用户交互
对象的不同属性,然后通过POST请求将该对象发送回服务器

我的问题是在哪里/如何存储
DailySetting
UserInteraction
对象?我认为我有一些选择:

  • 将它们作为属性存储在 高层管理,然后每次我需要引用对象时,循环 通过VC的,直到我找到根,然后访问公众 财产。这似乎很浪费,也不太合乎逻辑
  • 将对象的/属性设置为静态,因为只有一个在使用 在任何时候。如果我理解正确,它们可能是垃圾 收集,因为他们不会设置为任何东西,所以可能不是最好的 接近
  • 将数据存储在SQLLite数据库中,并在每次调用时调用该数据库 变化。这似乎有点过头了,只是参考了 当前对象
  • 对于DailySetting对象,将其保存在应用程序设置中,但 这是临时设置的最佳场所吗
  • 另一个比我想象的更好的方法

必须有一个正确的位置,我可以附加当前使用的对象,然后从不同的类/视图控制器等引用它们。

有许多不同的方法和图示来实现这一点。 主要概念包括:
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。

使用依赖注入系统,如Structuremap。您可以将对象的实例声明为单例,然后它们可以在类之间共享

注册很简单,如下所示:

For<IYourInterface>().Use<YourClass>().Singleton();
我推荐structure map,因为它有一种很好的方法,可以通过识别命名约定自动将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();
      }
}
public类DefaultRegistry:Registry
{
var lgr=新的记录器(“文件路径或其他…”);
公共注册处()
{
扫描(
扫描=>
{
scan.Assembly(“YourApp.Data”);
scan.Assembly(“YourApp.Domain”);
扫描。卡入总成();
scan.WithDefaultConventions();
使用(新的ControllerConvention())扫描;
});
For().Use(lgr.Singleton();
}
}
StructureMap也有很好的指南帮助您从这里开始:


请注意,在MVC中不必使用structuremap。您可以在任何C#应用程序中使用它

如果您有很多需要引用的类,那么一个可以被所有其他项目引用的项目是一个很好的方法。在设置中保存值是很好的,如果只有少数值,并且您确信永远不会添加到这些值中。否则,转到数据库。这就是它的目的。我建议您查看一下MvvmCross的服务位置:很好地完成了基本工作,但它不是线程安全的。话虽如此。。。线程安全不是一项要求+1 :-)
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();
      }
}