2014-06-15 38 views
1

我正在开发一个Xamarin iOS项目,但我想这个问题将适用于任何C#项目,而不是Xamarin特定的。我正在开发一个基于iPad的售货亭应用程序,店主在早上登录,然后用户可以全天注册并订购产品。在哪里链接对象,以便它们可以在许多类中引用

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

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

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

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

一定有,我可以附上目前的对象在使用,然后从不同的类/ ViewControllers等

+0

如果您有许多需要引用的类,那么可以通过所有其他项目引用的项目是一个好方法。如果只有少数几个设置值,那么在设置中保存值很好,并且您确定永远不会添加它们。否则,去数据库。那就是它的目的。 – paqogomez

+0

我建议查看MvvmCross的服务位置:https://github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control –

回答

1
引用他们一个正确的地方

有很多不同的方法和哲学来解决这个问题。 主要概念是: DailySetting或依赖性注入的单例实例。

Singleton模式:

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。

+0

很高兴做基本工作,但它不是线程安全的。这就是说...正在线程安全并不是必需的。 +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/

注意structuremap不具有MVC使用。你可以在任何C#应用程序中使用它。

相关问题