Это правильный способ избежать шаблона ServiceLocator, используя Constructor Injection?
Это правильный способ избежать шаблона ServiceLocator, используя Constructor Injection?
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 для экспорта, и
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();
}
}
На самом деле еще не пробовал, но было интересно, есть ли другие пути для достижения этой цели.
Спасибо
1 ответ
Если мое понимание верно, вам нужна фабрика
То, чего вы пытаетесь достичь, на самом деле стало действительно обычным, и это потому, что контейнеры IoC разрешают зависимости при запуске приложения, и в большинстве приложений требуемые зависимости необходимо вводить на основании некоторых ограничений.
Контейнеры Moderns IoC пытаются решить эту проблему, как Guice for Java
Прочтите это, чтобы получить больше информации о фабриках:
https://github.com/ninject/ninject.extensions.factory/wiki
Вам нужна фабрика для создания правильного типа на основе параметра, и вы можете разместить вызов вашего локатора службы внутри своей фабрики (я знаю, что вы используете анти-шаблон локатора службы, но вы перемещаете его из своего домена к фабрике фабрика используется только для соединения объектов, поэтому обычно приходится обращаться к IoC внутри фабрики).
Для справки:
http://www.youtube.com/watch?v=wEhu57pih5w&feature=player_embedded