多接口的依赖注入

Akh*_*hil 8 c# dependency-injection interface

我只是学习接口隔离原理.但是在学习之后我对示例中的场景感到困惑.

这个概念是将接口分成简单的接口.那很好,但我的问题是层次结构模型与否?

以我在书中研究的例子为例.

我有一个产品接口具有以下属性

public interface IProduct
{
decimal Price { get; set; }
decimal WeightInKg { get; set; }
int Stock { get; set; }
int Certification { get; set; }
int RunningTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我只是简化了界面中的一个类implmentation

public class DVD : IProduct
{
public decimal Price { get; set; }
public decimal WeightInKg { get; set; }
public int Stock { get; set; }
public int Certification { get; set; }
public int RunningTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题是当应用于没有相关属性的其他类别时.为TShirt创建类时,不需要Certification和RunningTime.因此,根据接口隔离原则,接口如下所示分开

创建一个新界面,将与电影相关的属性移动到这个属性,如下所示

public interface IMovie
{
int Certification { get; set; }
int RunningTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以IProduct没有这些属性和实现,如下所示

public class TShirt : IProduct
{
public decimal Price { get; set; }
public decimal WeightInKg { get; set; }
public int Stock { get; set; }
}

public class DVD : IProduct, IMovie
{
public decimal Price { get; set; }
public decimal WeightInKg { get; set; }
public int Stock { get; set; }
public int Certification { get; set; }
public int RunningTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在概念上我对此感到满意.但是,如果这关于真正的方法实现这样.当我使用依赖注入时,我使用哪个接口作为DVD类的类型.

我很困惑或者我错过了什么?如果我应用继承逻辑,我们可以使用较低级别的接口,因此基接口也继承.但如果我这样使用怎么能实现?

Gra*_*ICA 7

如果你知道什么,这是一个电影总是会也是一个产品,你可以定义你的接口像这样,在IMovie扩展IProduct:

public interface IProduct
{
    decimal Price { get; set; }
    decimal WeightInKg { get; set; }
    int Stock { get; set; }
}

public interface IMovie : IProduct
{
    int Certification { get; set; }
    int RunningTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你的DVD类只实现了IMovie接口:

public class DVD : IMovie
{
    public decimal Price { get; set; }
    public decimal WeightInKg { get; set; }
    public int Stock { get; set; }
    public int Certification { get; set; }
    public int RunningTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

使用您的其他示例,也许您TShirt实现了一个IClothing接口,它也是一个产品:

public class IClothing : IProduct
{
    int Size { get; set; }
    Color Color { get; set; }
}

public class TShirt : IClothing
{
    public decimal Price { get; set; }
    public decimal WeightInKg { get; set; }
    public int Stock { get; set; }
    public int Size { get; set; }
    public Color Color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,当您注入依赖项时,可以请求IMovie或的实例IClothing.