DIコンテナーを使用していない場合は、MVC3アプリでEntityFrameworkライブラリを参照する必要はなく、DAL / Repoレイヤーを参照するビジネスレイヤーのみを参照します。
「DependencyResolver」という別のプロジェクトを作成できます。このプロジェクトでは、すべてのライブラリを参照する必要があります。
これで、UIレイヤーでNHibernate / EFや、参照するCastle Windsor以外のUIに関連しないその他のライブラリは必要なくなりました。
Castle WindsorとDependencyResolverをUIレイヤーから非表示にしたい場合は、IoCレジストリなどを呼び出すHttpModuleを記述できます。
StructureMapの例しかありません。
public class DependencyRegistrarModule : IHttpModule
{
private static bool _dependenciesRegistered;
private static readonly object Lock = new object();
public void Init(HttpApplication context)
{
context.BeginRequest += (sender, args) => EnsureDependenciesRegistered();
}
public void Dispose() { }
private static void EnsureDependenciesRegistered()
{
if (!_dependenciesRegistered)
{
lock (Lock)
{
if (!_dependenciesRegistered)
{
ObjectFactory.ResetDefaults();
// Register all you dependencies here
ObjectFactory.Initialize(x => x.AddRegistry(new DependencyRegistry()));
new InitiailizeDefaultFactories().Configure();
_dependenciesRegistered = true;
}
}
}
}
}
public class InitiailizeDefaultFactories
{
public void Configure()
{
StructureMapControllerFactory.GetController = type => ObjectFactory.GetInstance(type);
...
}
}
DefaultControllerFactoryはIoCコンテナを直接使用しませんが、IoCコンテナメソッドに委譲します。
public class StructureMapControllerFactory : DefaultControllerFactory
{
public static Func<Type, object> GetController = type =>
{
throw new InvalidOperationException("The dependency callback for the StructureMapControllerFactory is not configured!");
};
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, controllerType);
}
return GetController(controllerType) as Controller;
}
}
GetController
デリゲートは、(ウィンザーでは、インストーラであるべきである)のStructureMapレジストリに設定されています。