簡體   English   中英

如何在Factory中重載泛型C#方法?

[英]How to overload generic C# methods in Factory?

我想創建類似工廠的東西,但它不是工廠模式的實現。

我有一個IServiceFactory接口:

public interface IServiceFactory
{
    TServiceInterface CreateService<TServiceInterface>(string url);
}

我想在我的實現中創建兩個不同的服務,實現兩個不同的接口。 我想我有:

public class FirstService : IFirstService {}
public class SecondService : ISecondService {}

public class ServiceFactory : IServiceFactory
{
    public IFirstService CreateService<IFirstService>(string url)
    {
        // logic of creation
    }

    public ISecondService CreateService<ISecondService>(string url)
    {
        // Unforchantly, it's not an overloaded method
    }
}

如何以這種方式創建SecondService 我知道我的問題和我的代碼示例很糟糕,這是一種不正確的方法,但想知道其他開發人員在這種情況下做了什么。 謝謝。

解決問題的最簡單方法可能是避免完全重載工廠方法(盡管不是'OO')。 檢查泛型類型參數,創建適當的實例,然后將其強制轉換為正確的類型:

public class ServiceFactory : IServiceFactory {
    public TServiceType CreateService<TServiceType>(string url)
        {
            Type t = typeof(TServiceType);

            if (t == typeof(IFirstService))
                return (TServiceType) CreateFirstServiceInstance(url);

            if (t == typeof(ISecondService))
                return (TServiceType) CreateSecondServiceInstance(url);

            throw new InvalidOperationException("Unsupported service type");
        }
}

目前, IServiceFactory的合同規定可以創建任何服務。 但是,您的具體實現僅提供兩種特定服務。 因此,您沒有實現接口契約。

我們如何解決這個問題? 通過更改實現(以便可以創建任何服務)或通過更改合同(以便只能創建兩個給定的服務)。 richzilla的答案為前者提供了一個例子,這是后者的一個例子:

public interface IServiceFactory
{
    IFirstService CreateFirstService(string url);
    ISecondService CreateSecondService(string url);
}

public class ServiceFactory : IServiceFactory
{
    public IFirstService CreateFirstService(string url) { ... }
    public ISecondService CreateSecondService(string url) { ... }
}

你甚至不需要泛型。 額外獎勵:如果第一個和第二個服務需要不同的參數,您也可以支持。

FirstService和SeconService應擴展一個通用接口(例如,它們的接口擴展了一個公共接口,如ServiceInterface,或者它們直接從一些常見接口擴展,如ServiceInterface)對於具體創建,您可以將希望的具體類型(或字符串...)傳遞給工廠的創建方法:

public interface IService {}
public interface IFirstService : IService {}
public interface ISecondService : IService {}
public class FirstService : IFirstService {}
public class SecondService : ISecondService {}

public class ServiceFactory : IServiceFactory {
    public IService CreateService<IService>(Type class, string url)
        {
            // logic of creation
            new class(url)
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM