当有字段,不仅是方法时,应如何使用依赖项注入

时间:2019-05-02 13:18:19

标签: c# dependency-injection

我试图理解依赖注入器,当我注入的接口只有方法时,这在我看来很有意义。但是,当我有需要指定特定值的字段时该怎么办?

我知道在创建该类的实例之后,可以像下面所做的那样分配值,但这是正确的方法吗?

interface IItem
{
    double Price { get; set; }
    string Name { get; set; }
    double Calories { get; set; }
    double Fats { get; set; }
    double Proteins { get; set; }
    double Sugars { get; set; }
    double Salt { get; set; }
}
class Item :  IItem
{
    public double Price { get; set; }
    public double Calories { get; set; }
    public double Fats { get; set; }
    public double Proteins { get; set; }
    public double Sugars { get; set; }
    public double Salt { get; set; }
    public string Name { get; set; }
}
class SomeClass
{
    public IItem _item;

    public SomeClass(ILabel label)
    {
         this._item = label;
    }
    public double SomeOperation()
    {
         return _item.Calories + _item.Fats + _item.Proteins; //just an example
    }
}

void main()
{
     IUnityContainer container = new UnityContainer();
     container.RegisterType<IItem, Item>();

     SomeClass example = container.Resolve<SomeClass>();

     //what I know I can do but I don't think it's the right way
     example._item.Price = 100.0;
     example._item.Salt = 4;
     //you get it, how can I populate that the right way? and what if I have an array of "SomeClass" do I need to do that with every instance?

}

我希望知道如何以正确的方式填充类。谢谢

2 个答案:

答案 0 :(得分:2)

依赖注入(DI)是将功能注入其他类型。

一个简单的例子是注入记录器。

class SomeClass
{
    public ILogger _logger;

    public SomeClass(ILogger logger)
    {
         this._logger = logger;
    }
    public double SomeOperation(IItem item)
    {
        _logger.Log("SomeOperation");
         return item.Calories + item.Fats + item.Proteins;
    }
}

答案 1 :(得分:0)

如果要指定属性的值,则可以使用该属性(默认值):

class ItemWithSalt :  IItem
{
    public double Price { get; set; } = 100.0;
    public double Calories { get; set; }
    public double Fats { get; set; }
    public double Proteins { get; set; }
    public double Sugars { get; set; }
    public double Salt { get; set; } = 4.0;
    public string Name { get; set; }
}

,但是放下二传手并创建类似这样的项目会更有意义:

interface IItem
{
    double Price { get;  }
    string Name { get;  }
    double Calories { get;  }
    double Fats { get;  }
    double Proteins { get;  }
    double Sugars { get;  }
    double Salt { get;  }
}

class SaltyItem: IItem
{
    public double Price => 100.00
    public double Salt => 4.0
    public string Name => "Salty";
}
class FattyItem: IItem
{
    public double Price => 100.00
    public double Fats => 4.0
    public string Name => "Fatty";
}
相关问题