1

私は次のサービスを受けました:

IRepository<TEntity, TPrimaryKey>

..次のように定義された実装を作成しました。

Repository<TEntity, TPrimaryKey>.

次のように解決できるように、autofacに登録するにはどうすればよいですか。

IRepository<User, int>
4

2 に答える 2

4
builder.RegisterGeneric(typeof (Repository<,>)).As(typeof (IRepository<,>));

私はautofacが大好きです。

于 2010-10-04T19:22:18.437 に答える
0

独自のソリューションの代わりに、新しいリポジトリ インスタンスを作成するためのファクトリを定義してみてください。

public interface IRepositoryFactory
{
    IRepository<TEntity, TPrimaryKey> 
        CreateRepository<TEntity, TPrimaryKey>();

    // Perhaps other overloads here
}

internal class RepositoryFactory : IRepositoryFactory
{
    public IContainer Container { get; set; }

    public IRepository<TEntity, TPrimaryKey> 
        CreateRepository<TEntity, TPrimaryKey>()
    {
        return container.Resolve<Repository<TEntity, TPrimaryKey>>();
    }
}

RepositoryFactory次のように登録できます。

builder.Register(c => new RepositoryFactory() { Container = c })
    .As<IRepositoryFactory>()
    .SingleInstance();

これで、コンストラクター引数として宣言IRepositoryFactoryして、新しいインスタンスを作成できます。たとえば、ProcessUserAccountUpgradeCommand依存関係に依存性注入を使用するこのクラスを見てください。

public ProcessUserAccountUpgradeCommand : ServiceCommand
{
    private readonly IRepositoryFactory factory;

    ProcessUserAccountUpgradeCommand(IRepositoryFactory factory)
    {
        this.factory = factory;
    }

    protected override void ExecuteInternal()
    {
        // Just call the factory to get a repository.
        var repository = this.factory.CreateRepository<User, int>();

        User user = repository.GetByKey(5);
    }
}

リポジトリを直接取得する代わりにファクトリを使用するのは少し面倒に思えるかもしれませんが、(メソッドを呼び出すため) 新しいインスタンスが取得されたことを設計で明確に伝えることができますCreateRepository。通常、IoC コンテナから返されたインスタンスは、寿命が長いと予想されます

もう 1 つのヒント: 主キー タイプの使用をリファクタリングすることをお勧めします。<User, int>リポジトリだけでなく、常にリポジトリを要求するのは面倒<User>です。おそらく、ファクトリ内で主キーを抽象化する方法を見つけるでしょう。

これが役立つことを願っています。

于 2010-10-06T08:59:15.080 に答える