2

私はファクトリパターンのこの実装を持っています

public interface IFactory<T>
{
    T GetObject();
}

public class Factory<T> : IFactory<T> where T : new()
{
    public T GetObject()
    {
        return new T();
    }
}

GetObjectしかし、ジェネリッククラスRepository<Customer>( )のインスタンスを返したいのですがRepository implement IRepository、ファクトリには引数(ISessionタイプ)があります

結果は次のようになります。

IRepository<ICustomer> myRepo = new Factory<ICustomer>(session);

これどうやってするの ?

ありがとう、

4

3 に答える 3

1

代わりに、パラメーターのないコンストラクターと、パラメーターを受け取る初期化関数を用意することを検討してください。ファクトリを介してパラメータを渡すことができないことを除いて、オブジェクトを逆シリアル化する場合を考慮してください。それらを構築し、その後、パラメータを1つずつ入力する必要があります。

于 2012-11-15T21:08:23.087 に答える
0

そのレベルのジェネリックが本当に必要かどうかはわかりませんが、ジェネリックの流暢なファクトリーアプローチを使用して、代わりにコンストラクターからではなく初期化関数を使用できます。

  var CustomerGeneric = GenericFluentFactory<Customer, WebSession>
                        .Init(new Customer(), new WebSession())
                        .Create();


public static class GenericFluentFactory<T, U>
{
    public static IGenericFactory<T, U> Init(T entity, U session)
    {
        return new GenericFactory<T, U>(entity, session);
    }        
}

public class GenericFactory<T, U> : IGenericFactory<T, U>
{
    T entity;
    U session;

    public GenericFactory(T entity, U session)
    {
        this.entity = entity;
        this.session = session;
    }

    public T Create()
    {
        return this.entity;
    }
}
于 2012-11-16T14:40:37.977 に答える
0

それほど一般的である必要がありますか?なぜこれが好きではないのですか?

public interface IFactory<T>
{
    IRepository<T> Create(ISession session);
}

public class RepositoryFactory<T> : IFactory<T> where T : new()
{
    public IRepository<T> Create(ISession session)
    {
        return new IRepository<T>();
    }
}
于 2012-11-15T21:25:22.273 に答える