我正在尝试消除两个使用完全相同代码创建DI容器的ASP.NET Web项目的重复。
我遇到了无法将静态标记为抽象的问题。
以下是重复的代码:
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; } }
}
}
答案 0 :(得分:1)
回答这个问题,
没有
static
方法不能为abstract
,因为static
方法不会被继承。
abstract
不能是static
,因为static
方法必须有实现。
C#和Java不能这样工作(到目前为止)。它引出了一个没有实际意义和无益的问题,static
方法面向对象吗?