2013-04-10 27 views
1

我有一个缓存库如何正确注入与内置的Funq容器的依赖关系?

public interface IRepository 
{ 
    void LogWebUsage(string html); 
    IEnumerable<ApiKey> GetApiKeys(); 
    ApiKey GetApiKey(Guid key); 
} 

public class Repository : IRepository 
{ 
    private static readonly ILog Log = LogManager.GetLogger("API.Repository"); 

    public IDbConnectionFactory DbFactory { get; set; } 

    public void LogWebUsage(string request) 
    { 
     Log.Debug(request); 
    } 

    public virtual IEnumerable<ApiKey> GetApiKeys() 
    { 
     List<ApiKey> result = null; 
     using (var db = DbFactory.OpenDbConnection()) 
     { 
      result = db.SelectParam<ApiKey>(q => q.Active); 
     } 

     return result; 
    } 

    public ApiKey GetApiKey(Guid key) 
    { 
     ApiKey result = null; 
     using (var db = DbFactory.OpenDbConnection()) 
     { 
      result = (db.SelectParam<ApiKey>(q => q.Id == key)).FirstOrDefault(); 
     } 

     return result; 
    } 
} 

public class CachedRepository : Repository 
{ 
    public ICacheClient Cache { get; set; } 

    public override IEnumerable<ApiKey> GetApiKeys() 
    { 
     const string cacheKey = "GetApiKeys"; 

     var result = Cache.Get<IEnumerable<ApiKey>>(cacheKey); 

     if (result == null) 
     { 
      result = base.GetApiKeys(); 

      if (result.Any()) 
      { 
       Cache.Add(cacheKey, result, TimeSpan.FromMinutes(30)); 
      } 
     } 
     return result; 
    } 
} 

我配置它,像这样。

//Register any dependencies you want injected into your services 
container.Register<IDbConnectionFactory>(new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("DBConnstr"), true, SqlServerOrmLiteDialectProvider.Instance)); 
container.Register<ICacheClient>(new MemoryCacheClient()); 
container.Register<IRepository>(new CachedRepository()); 
container.RegisterAutoWired<CachedRepository>(); 

那么,我希望的是,无论是IDbConnectionFactory和ICacheClient会在运行时被注入,但都是空。如何正确解释这种类型的依赖关系图?

谢谢 斯蒂芬

更新

Google上搜寻了几个小时后,我终于找到一个可行的解决方案。通过配置构造器注入。

public class CachedRepository : Repository 
{ 
    private ICacheClient Cache { get; set; } 

    public CachedRepository(IDbConnectionFactory dbFactory, ICacheClient cache) : base(dbFactory) 
    { 
     Cache = cache; 
    } 

    public override IEnumerable<ApiKey> GetApiKeys() 
    { 
     const string cacheKey = "GetApiKeys"; 

     var result = Cache.Get<IEnumerable<ApiKey>>(cacheKey); 

     if (result == null) 
     { 
      result = base.GetApiKeys(); 

      if (result.Any()) 
      { 
       Cache.Add(cacheKey, result, TimeSpan.FromMinutes(30)); 
      } 
     } 
     return result; 
    } 
} 

配置

//Register any dependencies you want injected into your services 
container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("DBConnstr"), true, SqlServerOrmLiteDialectProvider.Instance));   
container.Register<ICacheClient>(c => new MemoryCacheClient()); 
container.Register<IRepository>(c => new CachedRepository(c.Resolve<IDbConnectionFactory>(), c.Resolve<ICacheClient>())); 

它的工作原理,但我还是想知道如何连接起来的财产注入。

保重, 斯蒂芬......再次

+0

DbFactory在Repository类中是私有的。 – 2013-04-10 07:22:17

+0

良好的捕获,固定,但在运行时仍然为空 – 2013-04-10 07:24:34

回答

4

这种API AutoWiring in ServiceStack's Funq IOC are here

使用通用API:

container.RegisterAutoWired<MyType>(); 
container.RegisterAutoWiredAs<MyType,IMyType>(); 

使用运行时类型的API:

container.RegisterAutoWiredType(typeof(MyType)); 
container.RegisterAutoWiredType(typeof(MyType),typeof(IMyType)); 
container.RegisterAutoWiredTypes(typeof(MyType),typeof(MyType2),typeof(MyType3)); 

所以基本上你可以使用任何上述的API au例如:

container.Register<IDbConnectionFactory>(c => new 
    OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("DBConnstr"), true, 
    SqlServerDialect.Provider));   

container.Register<ICacheClient>(c => new MemoryCacheClient()); 
container.RegisterAutoWiredAs<CachedRepository,IRepository>(); //auto-wired 
相关问题