2017-03-18 1 views
1

Stellen Sie sich vor, dass ich Schnittstellen wie unter dem alle erbt von ICacheManager <>Ist es möglich, ICacheManager <> mit verschiedenen Arten von Konfigurationen gleichzeitig zu verwenden? ICacheManager {CacheType} Schnittstellen zu UMSETZEN von Cache-Klassen injizieren, wie

public interface ICacheManagerRuntime<T> : ICacheManager<T> 
public interface ICacheManagerRedis<T> : ICacheManager<T> 
public interface ICacheManagerRedisWithRuntime<T> : ICacheManager<T> 

Ich möchte:

CacheRuntime, CacheRedis, CacheRedisWithRuntime 

Mit Einheit Ich möchte um sie wie unten zu injizieren:

container.RegisterType<ICacheManagerRuntime<object>>(
       new ContainerControlledLifetimeManager(), 
       new InjectionFactory((c, t, n) => 
       { 
        return CacheFactory.Build... // Return CacheManager just with RuntimeCacheHandle 
       }))); 


container.RegisterType<ICacheManagerRedis<object>>(
       new ContainerControlledLifetimeManager(), 
       new InjectionFactory((c, t, n) => 
       { 
        return CacheFactory.Build... // Return CacheManager just with RedisCacheHandle 
       }))); 


container.RegisterType<ICacheManagerRedisWithRuntime<object>>(
       new ContainerControlledLifetimeManager(), 
       { 
        return CacheFactory.Build... // Return CacheManager just with RuntimeCacheHandleWithRedisBackPlane 
       }))); 

Was auch immer ich getan habe, bekomme ich diese Ausnahme:

An unhandled exception of type 'Microsoft.Practices.Unity.ResolutionFailedException' occurred in Microsoft.Practices.Unity.dll 

Additional information: Resolution of the dependency failed, type = "Solid.Play.Business.Interfaces.IProductService", name = "(none)". 

Exception occurred while: Resolving parameter "cache" of constructor Solid.Play.Cache.Caches.CacheRuntime(Solid.Play.Cache.Interfaces.ICacheManagerRuntime`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] cache). 

Exception is: InvalidCastException - Unable to cast object of type 'CacheManager.Core.BaseCacheManager`1[System.Object]' to type 'Solid.Play.Cache.Interfaces.ICacheManagerRuntime`1[System.Object]'. 

----------------------------------------------- 

At the time of the exception, the container was: 



    Resolving Solid.Play.Business.Services.ProductService,(none) (mapped from Solid.Play.Business.Interfaces.IProductService, (none)) 

    Resolving Solid.Play.Cache.Interception.CachingInterceptorBehavior,(none) 

    Resolving parameter "cache" of constructor Solid.Play.Cache.Interception.CachingInterceptorBehavior(Solid.Play.Cache.Interfaces.ICacheSolid cache) 

     Resolving Solid.Play.Cache.Caches.CacheSolid,(none) (mapped from Solid.Play.Cache.Interfaces.ICacheSolid, (none)) 

     Resolving parameter "cacheRuntime" of constructor Solid.Play.Cache.Caches.CacheSolid(Solid.Play.Cache.Interfaces.ICacheRuntime cacheRuntime, Solid.Play.Cache.Interfaces.ICacheRedis cacheRedis, Solid.Play.Cache.Interfaces.ICacheRedisWithRuntime cacheRedisWithRuntime) 

     Resolving Solid.Play.Cache.Caches.CacheRuntime,(none) (mapped from Solid.Play.Cache.Interfaces.ICacheRuntime, (none)) 

     Resolving parameter "cache" of constructor Solid.Play.Cache.Caches.CacheRuntime(Solid.Play.Cache.Interfaces.ICacheManagerRuntime`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] cache) 

Antwort

1

Die Umwandlung funktioniert nicht, weil Sie versuchen, eine Instanz auf eine Schnittstelle zu implementieren, die nicht implementiert wird. vereinfacht, was man sieht wie folgt versuchen:

public interface IBase 
{ 
} 

public interface ISub : IBase { } 

public class BaseClass : IBase 
{ 
} 

var sub = (ISub)new BaseClass(); 

Wenn Sie andere Art von Instanzen der gleichen Schnittstellen, die Unity DI-Framework bietet eine Möglichkeit, das zu tun, über Namen Injektion injizieren wollen.

Beispiel:

 container.RegisterType<ICacheManager<object>>("runtimeCache", 
     new ContainerControlledLifetimeManager(), 
     new InjectionFactory((c, t, n) => 
     { 
      return CacheFactory.Build<object>(s => 
      { 
       s.WithSystemRuntimeCacheHandle("cache.runtime"); 
      }); 
     })); 

     container.RegisterType<ICacheManager<object>>("redisCache", 
     new ContainerControlledLifetimeManager(), 
     new InjectionFactory((c, t, n) => 
     { 
      return CacheFactory.Build<object>(s => 
      { 
       s.WithRedisConfiguration("cache.redis", config => 
       { 
        config 
        .WithAllowAdmin() 
        .WithDatabase(0) 
        .WithEndpoint("localhost", 6379); 
       }) 
       .WithRedisCacheHandle("cache.redis"); 
      }); 
     })); 

die erste zu lösen, würden Sie

var runtimeCache = container.Resolve<ICacheManager<object>>("runtimeCache"); 

verwenden Sie können die ICacheManager Schnittstelle zu Konstrukteuren mit Attributen zum Beispiel injizieren.

public YourClass([Dependency("runtimeCache")] ICacheManager<object> cache) 
{ 

} 
+0

Ohh, das ist der Trick von der sehr Anfang war: [Abhängigkeit („runtimeCache“)] Durch diese Funktion nicht zu wissen (nicht genannt Injektion vor der Verwendung), ich habe versucht, eine finden herumarbeiten. Vielen Dank noch einmal! –

Verwandte Themen