日期:2014-05-17  浏览次数:20933 次

依赖性 C#
近来看了一些外国人写的书籍,
发现了一个不太习惯的地方:
那就是他们写程序的时候喜欢写一个接口 , 比如:
public interface IProductRepository
    {
        IQueryable<Product> Products { get; }

        void SaveProduct(Product product);

        void DeleteProduct(Product product);

    }//end interface
    
然后写一个具体的类来继承接口

public class  EFProductRepository : IProductRepository
{
    //具体不写了
}

最后就是将类模型绑定到 ninject 中  
ninjectKernel.Bind<IProductRepository>().To<EFProductRepository>();


后面程序里面用的时候,就用:
IProductRepository repository这个就行了!!


我的问题是:为什么一开始不直接写具体的EFProductRepository  ,  用的时候就直接用EFProductRepository ,接口看起来很多余!
我看别人的说法是:使用di容器(比如刚才的ninject)可以保持松散耦合,什么叫松散耦合,什么叫依赖性啊??

------解决方案--------------------
就是说比如
A调用B,那么A依赖B,如果我们需要让A调用C,那么就要修改A的代码。
class A
{
    public void foo()
    {
        //B b = new B();
        //b.bar();
        C c = new C();
        c.bar();
    }
}
class B
{
    public void bar()
    {
        ...
    }
}
class C
{
    public void bar()
    {
        ...
    }
}
为什么我们要让A调用C?比如B是一个SQL Server数据库的访问层,C是一个MySQL的访问层,A是BLL,现在我们要替换实现,那么就需要修改A了。

我们希望A不修改,怎么办?
class A
{
    Public I dal;
    public void foo()
    {
        dal.bar();
    }
}
interface I
{
    void bar();
}
class B : I
{
    public void bar()
    {
        ...
    }
}
class C : I
{
    public void bar()
    {
        ...
    }
}
我们只要在实例化