2017-04-16 82 views
1

我有兩個具有不同構造函數的類。
有一個參數使用不同的構造函數爲不同的類創建實例

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

有兩個參數。

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

在開始時,我在下面使用初始化類。

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

但是,它只對一個參數不起作用。上述情況有沒有更好的方法。我想創建一個方法,允許在構造函數中使用不同的參數創建不同的類。

回答

1

聽起來,你需要一個依賴注入(DI)庫,像AutofacNijectSimple injector

例如Simple Injector:

// 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

XUnit Core是否支持Autofac?你能和我分享一個簡單的指南鏈接嗎?謝謝 –

+0

它支持.net核心,所以xunit也可以。這是一個很好的鏈接:http://autofac.readthedocs.io/en/latest/getting-started/index.html – Julian

0

我想創建一個方法,使其能夠在構造函數中使用不同的參數創建不同的類。

那麼我想最簡單的方法是檢查每個案例。

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 
    } 
} 
相關問題