如何指定我需要通过Autofac注册到特定类型的类型

时间:2013-11-23 07:59:07

标签: .net ioc-container autofac

我想为不同的战士指定武器类型

public interface IWarrior
{
    string Kill();
}

public interface IWeapon
{
    string KillSound();
}

public class Zombie : IWarrior
{
    private readonly IWeapon _weapon;

    public Zombie(IWeapon weapon)
    {
        _weapon = weapon;
    }

    public string Kill()
    {
        return _weapon.KillSound();
    }
}

public class Soldier : IWarrior
{
    private readonly IWeapon _weapon;

    public Soldier(IWeapon weapon)
    {
        _weapon = weapon;
    }

    public string Kill()
    {
        return _weapon.KillSound();
    }
}

public class Gun : IWeapon
{
    public string KillSound()
    {
        return "Pif-paf";
    }
}

public class Teeth :IWeapon
{
    public string KillSound()
    {
        return "Chew-chew-chew";
    }
}

我想指定这样的内容:

builder.RegisterType<Gun>().As<IWeapon>().Where(t => t.Name.Equals("Soldier")); builder.RegisterType<Teeth>().As<IWeapon>().Where(t => t.Name.Equals("Zombie"));

我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

  

我想为不同的存储库定义不同的数据库(我使用更多   不同数据类型的一个数据源)。喜欢   。builder.RegisterType()为(),其中(T =&GT; t.Name。载( “someName”))。   和   。builder.RegisterType()为(),其中(T =&GT; t.Nam e.Not.Contains( “someName”));

最好从设计中消除歧义。您的IDbDataContext不明确,因为FirstDbDataContextSecondDbDataContext不是同一合同的真正兼容的实现,因为它们不可互换;存储库需要某个数据库,并且当传入错误数据库的IDbDataContext时,它将失败。

尝试为每个上下文提供自己的抽象,例如IFirstDbDataContextISecondDbDataContext。通过让存储库明确依赖于这些接口中的任何一个,任何查看构造函数的人都会清楚这个存储库所依赖的内容。

但是对于任何维护代码的人来说,它不仅变得容易得多,而且使用DI容器将所有内容连接在一起变得非常容易,只是因为你消除了歧义。

这是您最终注册的注册:

builder.RegisterType<FirstDbDataContext>().As<IFirstDbDataContext>();
builder.RegisterType<SecondDbDataContext>().As<ISecondDbDataContext>();