私は 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();
}
}
どんな助けでも大歓迎です!
ありがとう!/ビクター