0

私は Unity 2 で ASP MVC 3 (RC) を使用して大成功を収めています。ただし、頭を抱えることができない問題が1つあります。舞台裏では、リポジトリからアクセスする POCO (Person、Company、...) を使用しています。リポジトリはジェネリック (EFRepository) として作成され、コンテキストを使用します。汎用リポジトリ タイプで LifetimeManager を使用しない場合、すべてが期待どおりに機能します。

        var container = new UnityContainer();
        container
            .RegisterType<ObjectContext, DataLayerContext>(
                new HttpRequestLifetimeManager<ObjectContext>())
            .RegisterType(typeof(IRepository<>), typeof(EFRepository<>))

        //Works
        var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>());
        //Works
        var webPersonRepository = (IRepository<WebPerson>)DependencyResolver.Current.GetService<IRepository<WebPerson>>();

ただし、LifetimeManager をリポジトリに追加すると、解決に失敗します。

        var container = new UnityContainer();
        container
            .RegisterType<ObjectContext, DataLayerContext>(
                new HttpRequestLifetimeManager<ObjectContext>())
            .RegisterType(typeof(IRepository<>), typeof(EFRepository<>),
                new HttpRequestLifetimeManager(typeof(IRepository<>)))

        //Works
        var unitOfWork = (IUnitOfWork)DependencyResolver.Current.GetService<IUnitOfWork>());
        //Does NOT work anymore!
        var webPersonRepository = (IRepository<WebPerson>)DependencyResolver.Current.GetService<IRepository<WebPerson>>();

何か案は?HttpRequestLifetimeManager の実装は非常に標準的です。

public class HttpRequestLifetimeManager<T> : HttpRequestLifetimeManager
{
    public HttpRequestLifetimeManager() : base(typeof(T))
    {

    }
}

public class HttpRequestLifetimeManager : LifetimeManager, IDisposable
{
    private readonly string _key;

    public HttpRequestLifetimeManager(Type T)
    {
        _key = @"HttpRequestContextLifetimeManager" + T.Name;
    }

    public override object GetValue()
    {
        return HttpContext.Current.Items[_key];
    }

    public override void RemoveValue()
    {
        HttpContext.Current.Items.Remove(_key);
    }
    public override void SetValue(object newValue)
    {
        HttpContext.Current.Items[_key] = newValue;
    }
    public void Dispose()
    {
        RemoveValue();
    }
}

どんな助けでも大歓迎です!

ありがとう!/ビクター

4

1 に答える 1

1

知りたい人がいれば、その理由は、私が使用したカスタム LifetimeManager が型を入力として使用したためです (ジェネリックを使用するか、コンストラクター引数として)。失敗するジェネリック型で LifetimeManager を使用する場合は、そうしないでください:)

最終的に、{string}+Guid.NewGuid() をキーとして使用することにしました。

/ビクター

于 2010-12-15T14:23:30.457 に答える