Внедрение зависимостей в ASMX Web Service с использованием Ninject - PullRequest
0 голосов
/ 26 июня 2019

У меня есть устаревшее веб-приложение ASP.NET, которое использует веб-службы .asmx. Как часть переписывания, мне нужно использовать DI для внедрения вновь написанных модулей в веб-сервис.

Я добавил следующие незначительные зависимости в проект, как описано в этот ресурс , и приложение некоторое время работало нормально.

Ninject модуль:

    public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        try
        {
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            RegisterServices(kernel);
            return kernel;
        }
        catch
        {
            kernel.Dispose();
            throw;
        }
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IClientContextFactory>().To<ClientContextFactory>();
        kernel.Bind<IContextStore>().To<ClientContextStore>();
        kernel.Bind<ITemplateFiller, HashedTemplateFiller>();

        // Map custom interfaces to business implementations
        kernel.Bind<IUserView>().To<UserView>();
        kernel.Bind<IBranchView>().To<BranchView>();
        kernel.Bind<IEntity<UserDetailsDto>>().To<UserRepository>();
        kernel.Bind<IEntity<Branch>>().To<BranchRepository>();
        kernel.Bind<IUserConfiguration>().To<UserConfigurations.UserConfiguration>();

        kernel.Bind<IMapper>().ToMethod(AutoMapper).InSingletonScope();
        kernel.Bind<IMember>().To<Admin.Service.Member.Member> ();

        // in-memory DB 
        kernel.Bind<IConnection>().To<SqlliteConnection>();
        kernel.Bind<IInMemoryContextFactory>().To<InMemoryContextFactory>();
    }
}

Тогда мой веб-сервис:

public class GridService: WebServiceBase
{
    [Inject]
    public IClientContextFactory contextFactory { get; set; }

    [Inject]
    public IMapper mapper { get; set; }

    [Inject]
    public IUserView userView { get; set; }
}

Возможно, после некоторого обновления зависимости или чего-то (что я не могу понять), когда я перехожу на страницу, которая использует инъекции Ninject, из Ninject выдается следующая ошибка:

> Object reference not set to an instance of an object.
   at Ninject.Planning.Bindings.BindingConfiguration.GetProvider(IContext context)
   at Ninject.Planning.Bindings.Binding.GetProvider(IContext context)
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.<>c__DisplayClass15.<Resolve>b__f(IBinding binding)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
   at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent)
   at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)
   at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target)
   at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Ninject.Activation.Providers.StandardProvider.Create(IContext context)
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.<>c__DisplayClass15.<Resolve>b__f(IBinding binding)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
   at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent)
   at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)
   at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target)
   at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Ninject.Activation.Providers.StandardProvider.Create(IContext context)
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.<>c__DisplayClass15.<Resolve>b__f(IBinding binding)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
   at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent)
   at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)
   at Ninject.Activation.Strategies.PropertyInjectionStrategy.GetValue(IContext context, ITarget target, IEnumerable`1 allPropertyValues)
   at Ninject.Activation.Strategies.PropertyInjectionStrategy.Activate(IContext context, InstanceReference reference)
   at Ninject.Activation.Pipeline.<>c__DisplayClass2.<Activate>b__0(IActivationStrategy s)
   at Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map[T](IEnumerable`1 series, Action`1 action)
   at Ninject.Activation.Pipeline.Activate(IContext context, InstanceReference reference)
   at Ninject.KernelBase.Inject(Object instance, IParameter[] parameters)
   at Ninject.Web.KernelContainer.Inject(Object instance)
   at Ninject.Web.NinjectHttpModule.OnPreRequestHandlerExecute(Object sender, EventArgs e)
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Я не могу понять, в чем причина. Я попытался обновить Ninject до версии 3.3.4, которая не поддерживает Ninject.Web, и мой веб-сервис больше не может наследовать от WebServiceBase. Без этого мои зависимости не разрешаются правильно.

Какое решение этой проблемы?

...