Mvc3 とUnity.Mvc3を使用して、テスト可能で分離されたサイトを構築していますが、明らかに何か間違っています。
私のApplication_Start()
私は依存関係を登録します:
// container is a property of the MvcApplication
// and the HierarchicalLifetimeManager should make sure that the registrations
// only last for this request (or should it?)
_container.Register<Interface, Class>(new HierarchicalLifetimeManager())
次にSession_Start()
、依存関係を解決して、いくつかのデータをセッションに保存しようとします。
var obj = _container.Resolve<Interface>();
この時点で、Unity がインターフェイスを解決できないという例外が発生しましたが、そのインターフェイスのクラスを登録したと思っていましたか???
私は途方に暮れており、解決策を見つけるのがますます難しくなっています。
編集:
これが私のコード全体で、不要な部分がいくつか省略されています。
public class MvcApplication : System.Web.HttpApplication
{
// as EDIT 2 says, this is wrong...
//private IUnityContainer _container = new UnityContainer();
protected void Application_Start()
{
// mvc stuff, routes, areas and whatnot
// create container here and it works, almost
var container = new UnityContainer();
// register dependencies
string connectionString = "String from config";
container.RegisterInstance<DbContext>(new CustomContext(connectionString), new HierarchicalLifetimeManager())
.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager())
.RegisterType(typeof(IRepository<>), typeof(Repository<>), new HierarchicalLifetimeManager());
// register controller resolver
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
// if i try to resolve repos here, it works and they all have the same context
// just like the unit of work
}
protected void Session_Start()
{
// here the container complains that it can't resolve the interface
// wrong
//var userRepo = _container.Resolve<IRepository<User>>();
// right, but still failes, because it is resolving DbContext
// instead of using the CustomContext instance
var userRepo = DependencyResolver.Current.GetService<IRepository<User>>();
// save some user data to session
}
}
public class SampleController : Controller {
// here the container tries to resolve the System.Data.Entity.DbContext
// instead of just giving the repo that instance that I registered
public SampleController(IRepository<Entity> repo) {
}
}
私は明らかに、この Unit-of-work や依存関係の注入などで惨めな失敗をしています。最悪の部分は、理由がわからないことです...ですから、歯を抜く前に助けてください。
編集2:
部分的にあります。上記のようにコンテナを作成すると、Session_Start()
. Application_Start()
ローカル変数として作成し、を使用するDependencyResolver
と、機能します。どのように、そしてなぜ、私を打ちますか?
ただし、インスタンスではDbContext
なく、まだ解決しようとしています。CustomContext
解決:
では、取引は次のとおりです。
問題 1) のコンテナへのアクセスSession_Start()
:
DependencyResolver
EDIT 2 で説明したように、ローカル コンテナー変数を使用することで解決し、 worksを介してコンテナーにアクセスします。
問題 2) 登録された db コンテキスト インスタンスの解決:
インスタンスの登録が機能しないことがわかりました。ただし、これは次のことを行います。
container.RegisterType<DbContext, CustomContext>(null, new HierarchicalLifetimeManager(), new InjectionConstructor(connectionString))
しかし、なぜこれがこのように機能するのかまだ理解できていないので、私は本当に満足していません. 久しぶりに本か何かを読まなければならないようだ。
よろしくお願いします。