在哪里链接对象,以便可以在许多类中引用它们

时间:2014-06-15 14:26:13

标签: c# xamarin.ios

我正在开发一个Xamarin iOS项目,但我想这个问题适用于任何C#项目,而不是特定于Xamarin。我正在开发一个基于iPad的自助服务终端应用程序,店主在早上登录,然后用户可以全天注册和订购产品。

当店主在早上登录时,我会进行REST API调用,收集当天的配置信息。例如,它会说明哪些产品应该是特色等.API调用会填充一个名为DailySetting的对象。

当用户与iPad交互时,我们会经历多个屏幕,而不是总是以相同的顺序,每个屏幕都有自己的ViewControllers。每个屏幕设置UserInteraction对象的不同属性,然后通过POST请求将其发送回服务器。

我的问题是在哪里/如何存储DailySettingUserInteraction个对象?我看到我有一些选择:

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

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

2 个答案:

答案 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的好方法。这将为您节省大量时间,因为您可以省略专门向接口注册类的负载。

此示例显示如何:

  • 在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/

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