是否可以使用“抽象静态”创建可重用的GlobalBase / HttpApplication?

时间:2011-11-07 16:56:42

标签: c# asp.net code-reuse

我正在尝试消除两个使用完全相同代码创建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; } }
    }
}

1 个答案:

答案 0 :(得分:1)

回答这个问题,

没有

static方法不能为abstract,因为static方法不会被继承。

abstract不能是static,因为static方法必须有实现。

C#和Java不能这样工作(到目前为止)。它引出了一个没有实际意义和无益的问题,static方法面向对象吗?