0

这是通过使用构造函数注入来避免 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();
    }
}

实际上还没有尝试过,但想知道是否还有其他方法可以实现这一目标。

谢谢

4

1 回答 1

1

如果我的理解是正确的,你需要一个工厂

您试图实现的目标实际上已经变得非常普遍,这是因为 IoC 容器在应用程序启动时解析依赖项,并且在大多数应用程序中,需要根据某些约束注入所需的依赖项。

现代 IoC 容器试图解决这个问题,比如 Guice for Java

阅读本文以获取有关工厂的更多信息:

https://github.com/ninject/ninject.extensions.factory/wiki

您需要一个工厂来根据参数创建正确的类型,并且您可以在工厂内部调用您的服务定位器(我知道您正在使用服务定位器反模式,但您正在将其从您的域中移出对于工厂而言,工厂仅用于连接对象,因此在工厂内部调用 IoC 很常见)。

以供参考:

http://www.youtube.com/watch?v=wEhu57pih5w&feature=player_embedded

于 2012-04-27T00:41:14.560 回答