Определение привязки Ninject без области действия для сохранения кода DRY - PullRequest
0 голосов
/ 16 марта 2020

У меня есть проект Web и проект Windows Service в моем решении. Я создал 2 разных модуля связывания для этих двух проектов, но, как вы видите, в нем много дублирующегося кода ... единственное отличие состоит в том, что я использую InRequestScope() для проекта Web и InTransientScope() для Windows Сервис проекта.

Можно ли объединить привязки и добавить область действия в зависимости от проекта / точки входа?

public class WebModule : NinjectModule
{
    public override void Load()
    {
        Bind<ApplicationDbContext>().ToSelf().InRequestScope();
        Bind<IMyRepository>().To<MyRepository>().InRequestScope();
        // more types ... InRequetScope();
    }
}

public class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<ApplicationDbContext>().ToSelf().InTransientScope();
        Bind<IMyRepository>().To<MyRepository>().InTransientScope();
        // more types ... InTransientScope();
    }
}

1 Ответ

1 голос
/ 16 марта 2020

Лучшее решение, которое я придумала, - это создать метод расширения:

public static class NinjectExtensions
{
    public static IBindingNamedWithOrOnSyntax<T> GetScopeByName<T>(this IBindingInSyntax<T> syntax, string scope)
    {
        if (scope.Equals("request", StringComparison.InvariantCultureIgnoreCase))
        {
            return syntax.InRequestScope();
        }
        else if (scope.Equals("thread", StringComparison.InvariantCultureIgnoreCase))
        {
            return syntax.InThreadScope();
        }
        else if (scope.Equals("singleton", StringComparison.InvariantCultureIgnoreCase))
        {
            return syntax.InSingletonScope();
        }

        return syntax.InTransientScope();
    }
}

И динамически установить область действия.

public class MyModule : NinjectModule
{
    private string _scope = "transient";

    public MyModule()
    {
        if (Convert.ToBoolean(ConfigurationManager.AppSettings["IsWebProject"]))
        {
            _scope = "request";
        }
    }

    public override void Load()
    {
        Bind<ApplicationDbContext>().ToSelf().GetScopeByName(_scope);
        Bind<IMyRepository>().To<MyRepository>().GetScopeByName(_scope);
        // more types ... InRequetScope();
    }
}

Примечание: я не уверен, что есть лучшее решение ... это самый чистый подход, который мне пришёл в голову.

...