0

我想解决如何注入资源到NSManagedObject子类实例,但找不到合理的方法。注入资源到NSManagedObject子类实例

简而言之,我有一个对象,它表示一个实体的行为方法需要的服务。此服务需要在运行时可用。

在Plain-Old-Objective-C-Object中,我只是简单地将这个对象作为构造函数参数传递,或者在构造后通过属性设置它。与多少个对象需要和使用一个委托类似。

但是,awakeFromInsert和awakeFromFetch显然不带任何参数,我也找不到任何地方挂钩到NSManagedObjectContext来配置NSManagedObjects后期初始化。

有没有人有解决方案?

作为一个完全人为的例子:

@interface ProductEntity : NSManagedObject 

@property (nonatomic, retain) NSNumber *unitPrice; 
@property (nonatomic, retain) MyTaxCalculatorService *taxCalculatorService; 

- (void)grossPriceForUnits:(NSUInteger)units; 

@end 

@implementation ProductEntity 

@dynamic unitPrice; 
@synthesize taxCalculatorService 

- (void)grossPriceForUnits:(NSUInteger)units 
{ 
    return [self.taxCalculatorService grossAmountForUnitPrice:self.unitPrice quantity:units]; 
} 

@end 

无视这是否是计算总价格(这是一个人为的例子)的最佳方式,我怎么会得到taxCalculatorService到例如ProductEntity?我无法覆盖init,并且我无法找到任何可以一致调用的实体[entity setTaxCalculatorService:service]。

想法?

+0

你说的是“服务”类的单个共享实例还是每个对象都有自己的实例? – jrturton

+0

每个实体都有一个对服务实例的引用。有些可能会分享,有些可能不会。在我设计的例子中,你可以想象有些产品的税收计算策略与其他产品不同。 –

回答

0

看来,你不能只是打电话给以下吗?

myProductEntityInstance.taxCalculatorService = [[MyTaxCalculatorService alloc] init]; 

它被定义为带有保留的属性,所以您的托管对象应该保留对它的引用。请注意,您对托管对象所做的更改不会保留,除非您在实体所在的上下文中调用保存

+0

问题是_where_来调用它。实体可以通过任何“NSFetchRequest”或通过遵循实体中定义的任何关系来实现。从理论上讲,我可以在应用程序中跟踪每个对'executeFetchRequest'的调用,使用遍历每个返回实体的图形的代码来查找任何ProductEntities并在其上设置该属性。那太糟了。 –

+0

噢......为了好玩,这些'executeFetchRequests'中的一些将被隐藏在类似'NSFetchedResultsController'的框架代码中,因此在这些情况下甚至不可能设置属性。 –

1

awakeFromFetch/awakeFromInsert将始终被调用。你将不得不从另一个方向来处理它 - 被管理对象将不得不从另一个类请求“services”实例(我认为这将是一个类方法) - 在你的awakeFrom *方法中就像这样:

self.serviceProvider = [ServiceProvider getServiceProviderForObject:self]; 

您的ServiceProvider类将拥有关于被管理对象的所有信息,并可能返回相应的实例。

+0

这与我使用的解决方法非常相似 - 一个单例帮助程序,用于保存实例上要设置的NSManagedObjectContext-> NSManagedObject子类类型名称 - >键+值属性的三级字典。然后,正如你所说的,NSManagedObject子类awakeFrom(Insert | Fetch)要求该单例进行最终初始化。虽然这很复杂 - 我希望有更简单的事情。 –

0

在我看来,到目前为止,最简单的方法是将grossAmountForUnitPrice:quantity:转换为您的TaxCalculatorService类中的Class方法。

然后,您可以调用[TaxCalculatorService grossAmountForUnitPrice:self.unitPrice quantity:units]而无需实例化taxCalculatorService类的实例。

这假设您的TaxCalculatorService没有实例化,影响它返回的值的状态,例如特定语言环境或类似的税率。如果是这样,那么当然你需要这些信息来实例化你正在描述的实例,所以如果需要额外的信息,你可以将它作为类方法的附加参数传递给它。