2013-03-05 19 views
19

私はUnitofWorkクラスを持ち、IUnitOfWorkを実装しています。Autofacで汎用タイプを登録する

var builder = new ContainerBuilder(); 
builder 
    .RegisterGeneric(typeof(UnitOfWork<Repository<>,>)) 
    .As(typeof(IUnitOfWork)) 
    .InstancePerDependency(); 

実装は次のとおりです:私はautofacとすることを登録しよう

public class Repository<T> : GenericRepository<T> 
    where T : BaseEntity 
{ 
    public Repository(IDbContext context) 
     : base(context) { } 
} 

public abstract class GenericRepository<T> 
    : IRepository<T>, IQueryable<T> where T : BaseEntity 
{ 
} 

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

public class UnitOfWork<T, O> : IUnitOfWork 
    where T : Repository<O> 
    where O : BaseEntity 
{ 
} 

public interface IUnitOfWork : IDisposable 
{ 
    void SaveChanges(); 
} 

のエラー"期待タイプ" を与えますが、別のプロジェクトで、この1つの作業

+0

" 「タイプが予想されます」というエラーが表示されます。 C#コンパイラがこのエラーを出すのですか? – Steven

+0

申し訳ありません、プロジェクトはコンパイルできず、UnitOfWorkの "Type Expected"というエラーが表示されます shortcode

答えて

42

には部分的に開かれたクラス(例:

var builder = new ContainerBuilder(); 
builder 
    .RegisterGeneric(typeof(UnitOfWork<,>)) 
    .As(typeof(IUnitOfWork)) 
    .InstancePerDependency(); 

where T : Repository<O>一般的な制約がRepository<>

すべきことであるが、第一引数の世話をします。しかし、それ:UnitOfWork<Repository<>,>であなたがtypeofTではなくOを指定している、とそれを試しますRegisterGenericとは動作しません。を作成する必要がありますので、IUnitOfWork<T,O>を作成する必要があります。

しかしあなたのモデルは非常に奇妙です。 UnitOfWorkに引数の型がRepository<>必要なのはなぜですか?

代わりに、あなたのUnitOfWork<E>コンストラクタでRepository<>を得ることができるタイプの引数としてそれを持つことの:

public class UnitOfWork<E> : IUnitOfWork<E> where E : BaseEntity 
{ 
    private readonly Repository<E> repository; 

    public UnitOfWork(Repository<E> repository) 
    { 
     this.repository = repository; 
    } 

    //.. other methods 

} 

IUnitOfWork<E>

public interface IUnitOfWork<E> : IDisposable where E : BaseEntity 
{ 
    void SaveChanges(); 
} 

そしてAutofac登録:

var builder = new ContainerBuilder(); 
builder 
    .RegisterGeneric(typeof(Repository<>)).AsSelf(); 
builder 
    .RegisterGeneric(typeof(UnitOfWork<>)) 
    .As(typeof(IUnitOfWork<>)) 
    .InstancePerDependency(); 
var container = builder.Build(); 

// sample usage 
var u = container.Resolve<IUnitOfWork<MyEntity>>(); 
+0

2番目のレポジトリの提案(3番目以上)? – shortcode

+0

「2番目のリポジトリ(3番目以上)...」とはどういう意味ですか?あなたはすでに 'Repository <>'を持っていますか?またはカスタム派生リポジトリを持っていますか?もしそうであれば、リポジトリとエンティティを指定する 'IUnitOfWork 'で私の最初の提案が必要です。 – nemesv

+0

あなたの答えに感謝します。本当に私を助けました。 – shortcode

関連する問題