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



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

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

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

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

  • 将它们作为属性存储在然后每次需要引用对象时,循环通过风险投资,直到我找到根,然后进入公众财产。这看起来很浪费,不太合乎逻辑。
  • 将对象的/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#应用程序中使用它。

最新更新