自从接触 IOptions 之后,一直纠结这样的问题:自己定义的 Options 要不要实现 IOptions 接口。
微软有的项目中实现了,比如 Caching 中的 MemoryCacheOptions :
public class MemoryCacheOptions : IOptions<MemoryCacheOptions> { public ISystemClock Clock { get; set; } public TimeSpan ExpirationScanFrequency { get; set; } = TimeSpan.FromMinutes(1); MemoryCacheOptions IOptions<MemoryCacheOptions>.Value { get { return this; } } }
有的项目中就没有实现,比如 Session 中的 SessionOptions :
public class SessionOptions { public string CookieName { get; set; } = SessionDefaults.CookieName; public string CookieDomain { get; set; } public string CookiePath { get; set; } = SessionDefaults.CookiePath; public bool CookieHttpOnly { get; set; } = true; public CookieSecurePolicy CookieSecure { get; set; } = CookieSecurePolicy.None; public TimeSpan IdleTimeout { get; set; } = TimeSpan.FromMinutes(20); }
但自己一直没发现实现 IOptions 究竟有什么用处,于是之前的代码就都没实现,比如之前一篇博文中的 TopClientOptions 。
今天在使用 EnyimMemcachedCore ,需要手动 new MemcachedClientOptions 给 MemcachedClientConfiguration 的构造函数传参时,终于明白了实现 IOptions 的真正用处。
public class MemcachedClientConfiguration : IMemcachedClientConfiguration { public MemcachedClientConfiguration( ILogger<MemcachedClient> logger, IOptions<MemcachedClientOptions> optionsAccessor) { } }
如果 MemcachedClientOptions 不实现 IOptions<MemcachedClientOptions> 接口,就根本无法将 MemcachedClientOptions 的实例传递给 MemcachedClientConfiguration 的构造函数。
所以,如果完全使用依赖注入,不会出现手动 new 的情况,可以不用实现 IOptions 。否则,必须要实现。保险起见,还是实现一下为好。
public class MemcachedClientOptions : IOptions<MemcachedClientOptions> { //.. public MemcachedClientOptions Value => this; }