这是通过使用构造函数注入来避免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 to Export,和
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();
}
}
还没有真正尝试过,但想知道是否有其他方法可以实现这一点。
感谢
答案 0 :(得分: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