在Typhoon中使用非属性方法初始化对象

时间:2014-03-07 16:47:42

标签: ios dependency-injection typhoon

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

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];

map和mapper对象在应用程序的整个生命周期内都不会更改。我想在Typhoon中创建ObjectMapper和ObjectMaps。 更新:似乎TyphoonFactoryProvider可能有所帮助,但我无法弄清楚如何将工厂创建的对象放入'maps'数组中。

2 个答案:

答案 0 :(得分: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"];
        }];
    }];
}

答案 1 :(得分:1)

TyphoonFactoryProvider在这里不会帮助你 - 这个(高级)类只提供了一种简洁的方法来获取一个实例,其中一些初始化器参数或属性在运行时才知道。 。通常在这里你要么:

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

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

如果我了解你,那么台风不会直接影响你所做的事情。但是,您始终可以注入一个对象实例(配置信息)以及一个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)];  
      }];
 }