1

メッセージ ビルダーとメッセージ送信者を生成するファクトリを作成する必要があります。私は3つのインターフェースを持っています:

public interface IMessageFactory<out T> where T : GenericMessage
{
    IMessageBuilder<T> CreateBuilder();
    IMessageSender<T> CreateSender();
}

public interface IMessageBuilder<out T>
{
    T Build(EmailMessage message);
    T Build(EmailTask task);
}

public interface IMessageSender<in T>
{
    void Send(T message);
}

問題は、コンパイラが言うように IMessageFactory がコンパイルされないことです

Invalid variance: The type parameter 'T' must be contravariantly valid on 'IMessageFactory<T>.CreateSender()'. 'T' is covariant.

IMessageSender で T を共変にすると、メソッドの引数の型として使用できなくなります。

そして、次のようなことを行うには、 T が IMessageFactory で共変である必要があります。

    public IMessageFactory<GenericMessage> CreateMessageFactory(DispatchService dispatchService)
    {
        if (dispatchService == DispatchService.Service1)
        {
            return new Service1MessageFactory();
        }
        else if (dispatchService == DispatchService.Service2)
        {
            return new Service2MessageFactory();
        }

        return null;
    }

どこ

public class Service1MessageFactory : IMessageFactory<Message<Service1Message>>
{
}

public class Service2MessageFactory : IMessageFactory<Message<Service2Message>>
{
}

public class Message<T> : GenericMessage
{
    public T SpecificMessage { get; private set; }

    public string UserLogin { get; set; }

    public Message(T message, string userLogin)
    {
        SpecificMessage = message;
    }
}

私はデッドロックに達しました。何か案は?

アップデート。

おそらく私はすべて間違ったことをしているので、基本的に必要なものだけを説明し、どうすればそれを達成できるかについてのヒントを教えてください.

だから、私は必要です:

  1. さまざまなタイプのメッセージのビルダーと送信者を作成できるようにする
  2. 各メッセージタイプのビルダーと送信者を作成するファクトリを持つ
  3. 渡されたパラメータに従ってファクトリを作成するファクトリメソッドを持つ
4

1 に答える 1