请教个Unity IOC的问题,谢谢

qq_19589573 2015-11-10 03:10:10
1.当ILoaction只有个实现类时代码是对的,当有多个实现类,如何分别使用实例注入IAnimal?


UnityContainer container = new UnityContainer();//创建容器
container.RegisterType<ILocation, Door>("door");//注册依赖对象
container.RegisterType<ILocation, Sofa>("sofa");//注册依赖对象
//如何分别使用Door和Sofa的实例注入IAnimal?????????????????????
IAnimal animal = container.Resolve<Dog>(????);//返回调用者
animal.Call();//叫


2.相关代码


/// <summary>
/// 动物
/// </summary>
public interface IAnimal
{
/// <summary>
/// 叫
/// </summary>
void Call();
}

/// <summary>
/// 狗
/// </summary>
public class Dog : IAnimal
{
[Dependency]
public ILocation Location { get; set; }

/// <summary>
/// 叫
/// </summary>
public void Call()
{
Console.WriteLine("狗在" + Location.GetName() + "汪汪汪……");
}
}

/// <summary>
/// 地点/场所
/// </summary>
public interface ILocation
{
string GetName();
}

/// <summary>
/// 大门
/// </summary>
public class Door : ILocation
{
public string GetName()
{
return "大门外";
}
}

/// <summary>
/// 沙发
/// </summary>
public class Sofa : ILocation
{
public string GetName()
{
return "沙发上";
}
}
...全文
162 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_19589573 2015-11-12
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
不我的意思是你的dog还是正常注册,然后你试着用下,不行的话,就需要分别注册,看是否可以
搞定了,不过得把属性注入改为构造器注入。不知道属性注入是否可以实现,但总算实现了。谢谢@娃都会打酱油了 。

UnityContainer container = new UnityContainer();
            container.RegisterType<ILocation, Door>("Door");
            container.RegisterType<ILocation, Sofa>("Sofa");
            container.RegisterType<IAnimal, Dog>("Dog1", new InjectionConstructor(container.Resolve<ILocation>("Door")));
            container.RegisterType<IAnimal, Dog>("Dog2", new InjectionConstructor(container.Resolve<ILocation>("Sofa")));
            IAnimal animal1 = container.Resolve<IAnimal>("Dog1");
            IAnimal animal2 = container.Resolve<IAnimal>("Dog2");
            animal1.Call();
            animal2.Call();

/// <summary>
    /// 狗
    /// </summary>
    public class Dog : IAnimal
    {
        //[Dependency]
        //public ILocation Location { get; set; }

        private ILocation Location;

        /// <summary>
        /// 构造器
        /// </summary>
        /// <param name="location"></param>
        public Dog(ILocation location)
        {
            this.Location = location;
        }

//。。。。。
    }
  • 打赏
  • 举报
回复
不我的意思是你的dog还是正常注册,然后你试着用下,不行的话,就需要分别注册,看是否可以
qq_19589573 2015-11-11
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
试下这样指定name呢,当然我假设你的dog有注册过了,虽然你的代码没写
container.Resolve<Dog>("door")
注册name="door"的dog,但程序还是不知道Dog里的Location属性使用大门还是沙发。可以讲得更详细点吗?谢谢! container.RegisterType<IAnimal, Dog>("door");
穷得响叮当 2015-11-10
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
试下这样指定name呢,当然我假设你的dog有注册过了,虽然你的代码没写
container.Resolve<Dog>("door")

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧