1

我尤其是 DI 和 Typhoon 的新手。我想知道是否可以使用初始化方法和属性以外的方法初始化对象。我有一个名为 ObjectMapper 的类,一个 ObjectMapper 可以有 N 个 ObjectMap。在使用台风之前,我会像这样创建地图:

ObjectMap *map1 = [ObjectMap new]; [map1 mapProperty:@"prop1" toName:@"name1"]; [map1 mapProperty:@"prop2" toName:@"name2"]; ObjectMap *map2 = [ObjectMap new]; [map2 mapProperty:@"prop3" toName:@"name3"]; mapper.maps = @[map1, map2];

在应用程序的整个生命周期中,映射和映射器对象永远不会改变。我想在 Typhoon 中创建 ObjectMapper 和 ObjectMaps。更新:似乎 TyphoonFactoryProvider 可能会有所帮助,但我不知道如何将工厂创建的对象放入“地图”数组中。

4

2 回答 2

2

如果您准备好冒险,您可以尝试支持方法注入的 Typhoon 的开发版本。(仍然没有记录,但似乎有效)

-(id) mappedComponent
{  
    return [TyphoonDefinition withClass:[ObjectMap class] injections:^(TyphoonDefinition *definition) {
        [definition injectMethod:@selector(mapProperty:toName:) withParameters:^(TyphoonMethod *method) {
            [method injectParameterWith:@"property"];
            [method injectParameterWith:@"name"];
        }];
    }];
}
于 2014-03-20T10:49:11.033 回答
1

TyphoonFactoryProvider在这里不会为您提供帮助——这个(高级)类只是提供了一种干净的方法来获取一个实例,其中一些初始化参数或属性在运行时才知道。. 通常在这里你会:

  • 获取实例,然后在两个单独的步骤中使用运行时已知 args 对其进行配置
  • 创建自定义工厂

TyphoonFactoryProvider 只是为您编写自定义工厂代码,以及处理一些内存管理细节。(惰性依赖)。它对例如:从一个视图控制器转换到另一个视图控制器很有用。

如果我理解你的话,你想要做的事情不能直接用 Typhoon 来实现。但是,您始终可以注入一个对象实例(配置信息)以及一个 afterPropertyInjection 回调来完成。例子:

-(id) mappedComponent
{
    return [TyphoonDefinition withClass:[MyType class] properties:^(TyphoonDefinition* definition)
    {
        // Any object. This time an NSDictionary using Objc literals shorthand 
        [definition injectProperty:@selector(mappings) withObjectInstance:@{
            @"prop1" : @"name1", 
            @"prop2" : @"name2", 
            @"prop3" : @"name3" 
         }];   
         //This can be a category method if you don't "own" the class in question. The method puts the object in the required state, using the config data provided. 
         definition.afterPropertyInject = @selector(myConfigMethod)];  
      }];
 }
于 2014-03-07T21:13:48.137 回答