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沒有實例化,影響它返回的值的狀態,例如特定語言環境或類似的稅率。如果是這樣,那麼當然你需要這些信息來實例化你正在描述的實例,所以如果需要額外的信息,你可以將它作爲類方法的附加參數傳遞給它。