CodeReview에서 내 코드를 검토 한 후 코드를 더 추상적으로 만드는 방법에 대한 질문에 갇혀 있습니다.
여기 에서 볼 수 있듯이 많은 사람들 이 리팩토링하기 쉽도록 ICommand
및 IConnection
인터페이스를 만들어야 한다고 제안합니다 .
내 예제에서는를 사용 IConnection
하지만 전체도 유효해야합니다 ICommand
.
나는 이와 같은 인터페이스를 만들어야한다고 생각했다.
public interface IConnection
{
//etc...
}
그런 다음에서 MySqlConnection
상속 할 수 있도록하려면 다음 과 같이 상속 할 IConnection
고유 MySqlConnection
한 항목 을 만들어야 합니다.
public class MySqlConnection : MySql.Data.MySqlClient.MySqlConnection, IConnection
{
//etc...
}
어느 새이 의미 MySqlConnection
여전히 메소드 및 필드를 것, 그리고 상속 것이다 IConnection
. 그런 다음 Database
이와 같은 클래스 를 작성할 수 있어야합니다 .
public abstract class Database
{
protected IConnection con;
}
그리고 이렇게 확장하십시오.
public class MySqlDatabase : Database
{
private override IConnection con = new MySqlConnection();
}
이제 내 문제는 MySqlConnection
입니다 sealed
. 확장 할 수 없기 때문에이 데이터베이스 클래스를 추상화 할 수있는 옵션이 없습니다.
질문은 ~이야; 추상화를 구현하는 적절한 방법 Database
이 있습니까? 그렇다면 어떻게해야합니까?
주의 이 질문은 (내 코드 검토 포스트 참조) 클래스가 싱글 인과 아무 상관이있다. 해당 문제가 발생했으며 질문과 관련이 없습니다.
해당 코드 리뷰에 대한 주석을 읽으면 실제로 사용 IDbConnection
하고 IDbCommand
자신을 롤링하는 대신 사용을 의미한다고 생각 합니다. 모든 ADO.NET 공급자는 이미이를 구현하고 있습니다.
당신이 원하는 경우 당신은 상속 할 수 DbConnection
및 IConnection
및 포장 을 MySqlConnection
. 모든 DbConnection
메서드 를 구현 하고 래핑 된 연결로 릴레이해야합니다.
public sealed class MyMySqlConnection : DbConnection, IConnection
{
public MyMySqlConnection(MySqlConnection underlyingConnection)
{
UnderlyingConnection = underlyingConnection;
}
public MySqlConnection UnderlyingConnection
{
get;
private set;
}
public override void Open()
{
UnderlyingConnection.Open();
}
// ...
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다