2017-04-16 6 views
1

Ich habe zwei Klassen mit verschiedenen Konstruktoren.
Es gibt einen ParameterErzeuge Instanz für verschiedene Klassen mit verschiedenen Konstruktoren

public TagService(IRepositoryAsync<Tag> tagRespository):base(tagRespository) 
{ 
     _tagRespository = tagRespository; 
} 

Es gibt zwei Parameter.

public AdsService(IRepositoryAsync<Ads> iadsRepository,IUnitOfWork unitOfWork):base(iadsRepository) 
{ 
     this._iadsRepository = iadsRepository; 
     this._unitOfWork = unitOfWork; 
} 

Am Anfang habe ich unten verwendet, um die Klasse zu initialisieren.

//services have different constractors 
Service = (TEntityService)System.Activator.CreateInstance(
    typeof(TEntityService), 
    new object[] { _repository, _unitOfWork } 
); 

Aber es funktioniert nicht nur für einen Parameter. Gibt es einen besseren Weg für das obige Szenario? Ich möchte eine Methode erstellen, die das Erstellen einer anderen Klasse mit dem anderen Parameter im Konstruktor ermöglicht.

Antwort

1

Sounds, dass Sie eine Dependency Injection (DI) Bibliothek benötigen, wie Autofac, Niject, Simple injector etc

Z.B. Einfacher Injektor:

// 1. Create a new Simple Injector container 
container = new Container(); 

// 2. Configure the container (register) 
container.Register<IRepositoryAsync<Tag>, TagService>(); 
container.Register<IRepositoryAsync<Ads>, AdsService>(); 
container.Register<IUnitOfWork >(); 

// 3. Verify your configuration 
container.Verify(); 

//4 
var service = container.GetInstance<TEntityService>(); 
+0

Wird Autofac in XUnit Core unterstützt? Könnten Sie mir einen einfachen Richtlinienlink geben? Danke –

+0

Es unterstützt .net-Core, also funktioniert xunit auch. Dies ist ein guter Link zu beginnen mit: http://autofac.readthedocs.io/en/latest/getting-started/index.html – Julian

0

Ich möchte eine Methode erstellen, die es ermöglicht, verschiedene Klassen mit anderen Parametern im Konstruktor zu erstellen.

Nun, ich denke, der einfachste Weg, dies zu tun ist, jeden Fall zu überprüfen.

public static TEntityService CreateService(object[] constructorParameters) { 
    if (constructorParameters.Length == 1 && 
     constructorParameters[0] is IRepositoryAsync<Tag>) { 
     return (TEntityService)System.Activator.CreateInstance(typeof(TagService), constructorParameters); 
    } else if (constructorParameters.Length == 2 && 
     constructorParameters[0] is IRepositoryAsync<Ads> && 
     constructorParameters[1] is IUnitOfWork) { 
     return (TEntityService)System.Activator.CreateInstance(typeof(AdsService), constructorParameters); 
    } else { 
     return null; // or you can throw an exception 
    } 
} 
Verwandte Themen