Я пытаюсь устранить дублирование в двух веб-проектах ASP.NET, использующих один и тот же код для создания контейнера DI.
Я столкнулся с проблемой невозможности пометить статическое как абстрактное.
Вот код, который дублируется:
namespace LendingTreeLib
{
public class Global : HttpApplication, IContainerAccessor
{
void Application_Start(object sender, EventArgs e)
{
BuildContainer();
}
void Application_End(object sender, EventArgs e)
{
CleanUp();
}
protected static void CleanUp()
{
if (Container != null)
{
Container.Dispose();
}
}
private static IUnityContainer _container;
public static IUnityContainer Container
{
get
{
return _container;
}
set
{
_container = value;
}
}
IUnityContainer IContainerAccessor.Container
{
get
{
return Container;
}
}
protected static void BuildContainer()
{
IUnityContainer container = new UnityContainer();
// ----------------------------------------------------------------
// --> this is where a call to an virtual/abstract seems to be required
// ----------------------------------------------------------------
Container = container;
}
}
}
Есть мысли о том, как я могу достичь своей цели?
ОБНОВЛЕНИЕ: Я думаю, что яВозможно, я спросил об этом, когда мог бы решить это сам, однако, я собираюсь опубликовать здесь свое решение, потому что оно было бы полезно для меня, прежде чем я его узнал ..
Поскольку Application_Start вызывается только один раз, иэто также метод экземпляра, и, похоже, нет никакого вреда в простом переключении на нестатические методы для моего решения.
Вот оно (без дополнительной косвенности):
namespace DAgents.Common.Web
{
public abstract class GlobalBase : HttpApplication, IContainerAccessor
{
void Application_Start(object sender, EventArgs e)
{
var container = new UnityContainer();
RegisterTypes(container);
GlobalBase.Container = container;
}
protected abstract void RegisterTypes(IUnityContainer container);
public static IUnityContainer Container { get; set; }
void Application_End(object sender, EventArgs e)
{
if (Container != null)
Container.Dispose();
}
IUnityContainer IContainerAccessor.Container { get { return GlobalBase.Container; } }
}
}