Это правильный способ избежать шаблона ServiceLocator с помощью внедрения конструктора?
public interface IEntitySomethingBase<TEntity>
{
//Stuff
}
public class AccountEntitySomething : IEntitySomethingBase<Account>
{
//Stuff
}
public class CustomerEntitySomething : IEntitySomethingBase<Customer>
{
//Stuff
}
public class OrderEntitySomething : IEntitySomethingBase<Order>
{
//Stuff
}
//Ditto, any number
Использование класса с помощью ServiceLocator, которого я хочу избежать.
public class MyConsumingClass
{
public object DoSomething<TEntity>(TEntity entity)
where TEntity : class
{
var thing = ServiceLocator.Current.GetInstance<IEntitySomethingBase<TEntity>>();
}
}
Решение с использованием MEF. Измените выше *EntitySomething's для экспорта и
public class MyConsumingClass
{
private List<Lazy<IEntitySomethingBase<Object>>> _things;
[ImportingConstructor]
public MyConsumingClass([ImportMany] List<Lazy<IEntitySomethingBase<Object>>> things)
{
_things = things;
}
public object DoSomething<TEntity>(TEntity entity)
where TEntity : class
{
var thing = _things.Cast<IEntityInformationExtractor<TEntity>>().Where(t => t.GetType().FullName == entity.GetType().FullName).FirstOrDefault();
}
}
На самом деле еще не пробовал, но задавался вопросом, есть ли другие способы добиться этого.
Благодарность