2012-02-14 33 views

回答

1

的接口從一個類的實現細節解耦消費者。這有助於實現可重用性,因爲實現接口的類可以更改,而無需更改使用實現的代碼。

這是非常令人困惑,也許一個例子有助於

public interface IUserAuthentication 
{ 
    public bool Authenticate(string name, string password); 
} 

現在,我會寫的消費者來說,並不關心如何進行身份驗證,它只是知道它可以驗證用戶身份。

public class Consumer 
{ 
    private IUserAutentication _auth; 
    public Consumer(IUserAuthentication auth) 
    { 
    _auth = auth; 
    } 

    public void Working(string username, string password) 
    { 
    if (!_auth.Authenticate(username, password)) 
    { 
     throw new Exception("error!"); 
    } 
    } 
} 

無論IUserAuthentication服務的實現如何,上面的代碼都可以工作。這是重用代碼的一種方法。

現在我可以實現IUserAuthentication接口

public class AuthenticateJasons : IUserAuthentication 
{ 
    public bool Authenticate(string username, string password) 
    { 
    return username == "Jason"; 
    } 
} 

public class AuthenticateNoone: IUserAuthentication 
{ 
    public bool Authenticate(string username, string password) 
    { 
    return false; 
    } 
} 

的一點是,這些實現都無關緊要,只要消費者來講。此外,這個問題與ASP.NET Web框架無關。這實際上是一個語言/平臺/框架不可知論的問題。無論您選擇實施哪種語言,答案都是一樣的。

+0

非常感謝@Jason – 2012-02-14 05:33:30

2

interface允許的數量你分開調用類關心的信息化實施。這使您可以將您的課程從親密的知識中解脫出來。

鑑於以下interface

public interface IRepository<T> { 
    void Save(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
} 

從屬類可以針對被編程所述接口,並從細節的「屏蔽」。

public class SomeService { 
    private IRepository<Contact> _contactRepo; 

    public SomeService(IRepository<Contact> contactRepo){ 
     _contactRepo = contactRepo; 
    } 
} 

利用這種模式,您可以創建的不同實現上述接口:

public class LinqToSqlRepository<Contact> : IRepository<Contact> 
{ /* ... */ } 
public class EntityFrameworkRepository<Contact> : IRepository<Contact> 
{ /* ... */ } 
public class NHibernateRepository<Contact> : IRepository<Contact> 
{ /* ... */ } 
+0

+1 - 你找到了工作! – 2012-02-14 05:09:26

+0

非常感謝@xander – 2012-02-14 05:33:44