2011-12-20 4 views
4

IAccountService라는 인터페이스가 있습니다. 또한 제품 및 패키지 등의 인터페이스도 동일합니다.일반 인터페이스를 만들 수 있습니까?

public interface IAccountService 
    { 
     void AddOrUpdate(Account account); 
     void Delete(Account account); 
     bool DoesTableExist(); 
     Account Get(Account account); 
     Account Get(string pk, string rk); 
     IEnumerable<Account> Get(); 
     IEnumerable<Account> Get(string pk); 
     string GetOptions(string pk, string rk); 
     IEnumerable<AccountDetail> ShowDetails(ref string runTime); 
     IEnumerable<AccountSummary> ShowSummary(ref string runTime); 
     void ValidateNoDuplicate(Account account); 
     void ValidateNoProducts(Account account); 
    } 

일반 메서드를 만들었지 만 일반 인터페이스를 만들 수도 있습니다. 그렇다면 나는 어떻게 그것을 부를 것이고, 내가 그것을 어떻게 변형 시켜서 일반화 할 수 있을까? 다음과 같이 현재 나는이 인터페이스를 사용

public class AccountService : BaseService, IAccountService 

업데이트 모든 제안을 한

감사합니다. 내가 여전히 문제가있는 한 가지는 AccountDetail 및 AccountSummary 클래스입니다. 아마 하위 클래스가되어야한다고 생각합니다. 그러나 어떻게 그 이름을 처리 할 수 ​​있습니까? 클래스 이름을 가져 와서 Detail을 추가 한 다음 인터페이스에서 사용하십시오. 가능한가요?

업데이트 2

여기에 세부 사항 및 요약 클래스의 예 :

public class AccountDetail 
{ 
    public string Title { get; set; } 
    public string Product { get; set; } 
} 
public class AccountSummary 
{ 
    public string Title { get; set; } 
    public Int32? ProductCount { get; set; } 
    public string PartitionKey{ get; set; } 
    public string RowKey { get; set; } 
    public DateTime? Modified { get; set; } 
    public string ModifiedBy { get; set; } 
} 

위 클래스가보고를 위해 사용된다. 아마 그들은 모델 저장소의 일부가되어서는 안된다고 생각하고 있습니다. 어쩌면 그들은 다른 장소에 있어야합니다.

ref 주석에 관해서.

_account.ShowDetails(ref runTime); 

ShowDetails의 출력은 세부 사항의 목록입니다 및 런타임 참조가이 보고서를 실행하는 데 걸리는 시간으로 업데이트됩니다 : 심판은 내 컨트롤러에서 나는 다음과 같은 방법을 호출하기 때문에이있다.

+1

이러한 매개 변수는 'ref'가 아니어야합니다. – SLaks

+0

Re : 업데이트 : 불가능합니다. 대답에 기존 접근법 중 하나를 사용해야합니다. – SLaks

답변

1

뭔가?

  1. 이 일반화 될 세 가지 유형이있을 듯 이렇게 세 해당 유형 매개 변수가 있습니다 :

    public interface IService<T, TDetail, TSummary> 
    { 
        void AddOrUpdate(T entity); 
        void Delete(T entity); 
        bool DoesTableExist(); 
        T Get(T entity); 
        T Get(string pk, string rk); 
        IEnumerable<T> Get(); 
        IEnumerable<T> Get(string pk); 
        string GetOptions(string pk, string rk); 
        IEnumerable<TDetail> ShowDetails(ref string runTime); 
        IEnumerable<TSummary> ShowSummary(ref string runTime); 
        void ValidateNoDuplicate(T entity); 
        void ValidateNoProducts(T entity); 
    } 
    

    몇 가지주의한다. 후자의 두 가지가 정확하지 않은 경우 계속해서 업데이트하거나 알려 주시면 도와 드릴 수 있습니다.

  2. 필자는보다 일반적인 용어로 매개 변수를 "엔터티"로 변경했습니다. 어떤 이름이든 당신에게 의미가있는 것을 선택할 수 있습니다.
  3. 마지막 두 가지 메서드 이름이 일반적으로 충분합니까? ValidateNoProducts이이 인터페이스의 Product 버전에도 존재하는 것으로 의심되는 것 같습니다. 이것은 참으로 올바른 추상화 경우 모두

모든, 그것은 하나의 일반적인 인터페이스를 만들 수있는 동안, 당신은 스스로에게 물어해야 할 한 가지 중요한 질문입니다. 이러한 방법 중 일부는 직관적으로 더 유형별이며 다른 유형의 서비스에 속할 수 있습니다.

이를 위해

, 당신은 또한 자신의 방법을 추가 구현하여 AccountService 및 기타 서비스를 다음 이러한 방법의 가장IService<>을 만들 수 있습니다. 잘못된 추상화가있는 둥근 구멍에 사각형 못을 끼워 넣는 것과는 대조적으로보다 현실적인 추상화처럼 보일 것입니다.

5

당신은 항상 할 수있는 :

상세/요약 방법의 경우
public interface IService<T> 
{ 
    bool TableExists { get }; 

    void AddOrUpdate(T item); 
    void Delete(T item); 
    T Get(T item); 
    T Get(string pk, string rk); 
    // etc 
} 

public class AccountService : BaseService, IService<Account> 

, 나는 별도의 위치 (매퍼 클래스의 아마 일종)으로 그들을 탈출 것입니다.

+0

하지만 어떻게 세부 사항을 지정할 수 있습니까? 원래 질문에 대한 내 의견보기. 감사. –

+0

@SamanthaJ - 일반 클래스에서 제공하지 않는 세부/요약 클래스에는 어떤 것이 있습니까? 이 클래스들이 현재 어떤 점에서 추가하는지 확신 할 수 없습니다. 그 사실을 아는 것은 디자인을 제안하는 데 도움이됩니다. –

4

당신은 일반적인 인터페이스 당신이 제네릭 클래스 만들기 같은 방법으로 만들 수 있습니다

public interface IRepository<T> { 
    void AddOrUpdate(T item); 
    bool TableExists { get; } 
    IEnumerable<T> All { get; } 

    ... 
    IEnumerable<Detail<T>> GetDetails(string runTime); 
    ... 
} 
+0

+1 님이이 댓글을 올렸을 때 AccountSummary 및 AccountDetail 문제를 처리 한 유일한 사람이었습니다. –

1
public interface IService<T> 
{ 
    void AddOrUpdate(T entity); 
    void Delete(T entity); 
    bool DoesTableExist(); 
    T Get(T entity); 
    T Get(string pk, string rk); 
    IEnumerable<T> Get(); 
    IEnumerable<T> Get(string pk); 
    string GetOptions(string pk, string rk); 
    IEnumerable<AccountDetail> ShowDetails(ref string runTime); // you will need to redisign this part 
    IEnumerable<AccountSummary> ShowSummary(ref string runTime); //same for this method 
    void ValidateNoDuplicate(T account); 
    void ValidateNoProducts(T account); 
} 

과 같이 사용 :

public class AccountService : BaseService, IService<Account> 
1
public interface IAccountService<T> 
{ 
... 
SomeDataType<T> SomeMethod(...); 
... 
} 
2

이 당신을 위해 작동합니다 :

public interface IService<T, TDetail, TSummary> 
    { 
     void AddOrUpdate(T account); 
     void Delete(T account); 
     bool DoesTableExist(); 
     T Get(T account); 
     T Get(string pk, string rk); 
     IEnumerable<T> Get(); 
     IEnumerable<T> Get(string pk); 
     string GetOptions(string pk, string rk); 
     IEnumerable<TDetail> ShowDetails(ref string runTime); 
     IEnumerable<TSummary> ShowSummary(ref string runTime); 
     void ValidateNoDuplicate(T account); 
     void ValidateNoProducts(T account); 
    } 

    public class AccountService : BaseService, IService<Account, AccountDetail, AccountSummary> 
    public class ProductService : BaseService, IService<Product, ProductDetail, ProductSummary> 
    public class PackageService : BaseService, IService<Package, PackageDetail, PackageSummary> 

세 가지 유형이 필요하거나 요약 및 세부 정보 메서드 자체를 처리하는 별도의 IAccountService 인터페이스가 있어야합니다.

public interface IService<T> 
{ 
    void AddOrUpdate(T entity); 
    T Get(T entity); 
    // etc 
} 

을 그리고처럼 사용 :

1

당신은 너무처럼 정의 할 수있다이 같은

public class AccountService : IService<Account> 
{ 
    void AddOrUpdate(Account entity); 
    Account Get(Account entity); 
    // etc 
} 
관련 문제