2017-08-19 2 views
-1

J'essaie de résoudre des instances en utilisant Autofac KeyFilter. Je reçois des résultats si explicitement résoudre les instances en utilisant ResolveKeyed <>. Cependant, lorsque vous utilisez KeyFilter dans Constructor, différentes instances sont résolues en tant que paramètres.Key Filter Constructor Utilisation Autofac Problème

est ici le petit exemple .. je suis venu ..

public enum TestApiEnum 
{ 
    TestA, 
    TestB 
} 
public interface ITestService 
{ 
} 
public interface ITestApi 
{ 
} 
public class TestService : ITestService 
{ 
    public TestService([KeyFilter(TestApiEnum.TestA)]ITestApi testApiA, 
    [KeyFilter(TestApiEnum.TestB)] ITestApi testApiB) 
    {  
    } 
} 
public class TestApiA : ITestApi 
{ 
    public TestApiA(TestApiEnum testEnum) 
    { 
     TestApiEnum = testEnum; 
    } 
    public TestApiEnum TestApiEnum { get; set; } 
} 

public class TestApiB: ITestApi 
{ 
    public TestApiB(TestApiEnum testEnum) 
    { 
     TestApiEnum = testEnum; 
    } 
    public TestApiEnum TestApiEnum { get; set; } 
} 

Builder Inscription

 builder.RegisterType<TestService>() 
      .As<ITestService>(); 

     builder.RegisterType<TestApiA>() 
       .AsImplementedInterfaces() 
       .Keyed<ITestApi>(TestApiEnum.TestA) 
       .WithAttributeFiltering() 
       .WithParameter("testEnum", TestApiEnum.TestA); 

     builder.RegisterType<TestApiB>() 
       .AsImplementedInterfaces() 
       .Keyed<ITestApi>(TestApiEnum.TestB) 
       .WithAttributeFiltering() 
       .WithParameter("testEnum", TestApiEnum.TestB); 

var builder = AutofacConfig.ConfigureContainer(); 
     using (var scope = builder.BeginLifetimeScope()) 
     { 
      // Able to Resolve following two.. 
      var testApiA = scope.ResolveKeyed<ITestApi>(TestApiEnum.TestA); 
      var testApiB = scope.ResolveKeyed<ITestApi>(TestApiEnum.TestB); 

      // following test service resolves both parameters as **testApiB** and **testApiB** 
      var testservice = scope.Resolve<ITestService>(); 
     } 

Répondre

1

i have pro similaires avec KeyFilter blèmes (link)

Dans votre cas, il est sur les points suivants: dans le constructeur KeyFilter ne fonctionne pas - il est un problème :-( il sera résolu que par l'interface, par dernière interface enregistrée :-( (dans votre cas TestB)

Check it out.

premier cas: ajouter:

builder.RegisterType<TestApiB>()     
       .As<ITestApi>() 
       .WithAttributeFiltering() 
       .WithParameter("testEnum", TestApiEnum.TestC); 

et commentez vos inscriptions (Peu importe) -> vous (toujours) Inscrivez-vous TestC

Deuxième cas: échange enregistrement initial -> la dernière inscription sera utilisée.

Troisième cas: commenter les lignes ".AsImplementedInterfaces()": vous obtiendrez une exception jusqu'à ne pas enregistrer le code du premier cas.