我想为不同的战士指定武器类型
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"));
我怎么能这样做?
答案 0 :(得分:1)
我想为不同的存储库定义不同的数据库(我使用更多 不同数据类型的一个数据源)。喜欢 。builder.RegisterType()为(),其中(T =&GT; t.Name。载( “someName”))。 和 。builder.RegisterType()为(),其中(T =&GT; t.Nam e.Not.Contains( “someName”));
最好从设计中消除歧义。您的IDbDataContext
不明确,因为FirstDbDataContext
和SecondDbDataContext
不是同一合同的真正兼容的实现,因为它们不可互换;存储库需要某个数据库,并且当传入错误数据库的IDbDataContext
时,它将失败。
尝试为每个上下文提供自己的抽象,例如IFirstDbDataContext
和ISecondDbDataContext
。通过让存储库明确依赖于这些接口中的任何一个,任何查看构造函数的人都会清楚这个存储库所依赖的内容。
但是对于任何维护代码的人来说,它不仅变得容易得多,而且使用DI容器将所有内容连接在一起变得非常容易,只是因为你消除了歧义。
这是您最终注册的注册:
builder.RegisterType<FirstDbDataContext>().As<IFirstDbDataContext>();
builder.RegisterType<SecondDbDataContext>().As<ISecondDbDataContext>();