Можно ли сделать повторно используемую GlobalBase / HttpApplication с «абстрактной статичностью»? - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь устранить дублирование в двух веб-проектах 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; } }
    }
}

1 Ответ

1 голос
/ 07 ноября 2011

В ответ на вопрос

номер

Метод static не может быть abstract, поскольку static методы не наследуются.

abstract не может быть static, поскольку методы static должны иметь реализацию.

C # и Java не работают таким образом (пока еще). Это приводит меня к спорному и бесполезному вопросу, являются static Методы объектно-ориентированным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...