2011-12-07 25 views
2

我真的很喜歡this suggestion on StackOverflow使用IClock接口爲您的代碼提供當前日期/時間,因此您可以在單元測試時提供不同的日期/時間(更不用說將所有DateTime.Now引用分解了)。如何在使用IClock和DI的實體中引用DateTime.Now?

我可以使用依賴注入爲我的服務層提供此接口的實現。

但是,我有很多DateTime.Now引用在我的實體(下面的示例)。解決這個問題的首選方式是什麼?

public class SampleEntity 
{ 
    private DateTime someField; 
    private DateTime someOtherDate; 

    public SampleEntity() 
    { 
    someField = DateTime.Now; 
    } 

    public bool SomeProperty 
    { 
    get { return someOtherDate < DateTime.Now.Date; } 
    } 

    public bool SomeFunction() 
    { 
    return SomeOtherDate < DateTime.Now.Date; 
    } 
} 

我可以傳遞參數中的功能和/或構造,但仍然要求我明確設置的東西,如果我檢索一個ORM的實體。

回答

2

如果你想使用IClock,你將與Clock.Now全部更換DateTime.Now,有你的類採取IClock實例構造函數:

public class SampleEntity 
{ 
    private DateTime someField; 
    private DateTime someOtherDate; 
    private readonly IClock _clock; 

    public SampleEntity(IClock clock) 
    { 
     _clock = clock; 
     someField = clock.Now; 
    } 

    public bool SomeProperty 
    { 
     get { return someOtherDate < _clock.Now.Date; } 
    } 

    public bool SomeFunction() 
    { 
     return SomeOtherDate < _clock.Now.Date; 
    } 
} 

至於傳遞一個IClock時的具體實施實例化實體大多數ORM框架提供了可用於提供實體自定義實例的鉤子。

如果您的ORM不提供這樣的掛鉤,您仍然可以使用來自使用public static Func<DateTime> Now =() => DateTime.Now;提供者的鏈接問題的接受答案。

0

如果您的依賴注入框架有類似於春天的autowire可以解決您遇到的問題。見Section 4.3.8

相關問題