Ninject Load FromAssembliesInPath с помощью конструктора - PullRequest
0 голосов
/ 26 мая 2011

если я скажу, есть код, который работает так:

    private static void LoadFromAssemblies(IKernel kernel)
    {
        string appPath = HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath);

        kernel.Scan(a =>
        {
            a.FromAssembliesInPath(string.Format(@"{0}\Extensions", appPath));
            a.AutoLoadModules();
            a.BindWithDefaultConventions();
            a.InRequestScope();
        });
    }

и просто предположим, что у каждого класса, определенного в целевой сборке, есть строковый аргумент в конструкторе, как мне передать строковый аргумент из кода выше?

Вместо этого я использую перехватчик?

Заранее спасибо, Джон

1 Ответ

0 голосов
/ 16 января 2012

В моем проекте в некоторых репозиториях я передаю ISession (nHibernate) и другим connectionString для DataContext (Linq2SQL)

Для передачи строки подключения я создал класс LinqConfiguration

public class LinqConfiguration : ILinqConfiguration
{
    private readonly string _connectionString;

    public LinqConfiguration(string connectionString)
    {
        _connectionString = connectionString;
    }

    public string GetConnectionString()
    {
        return _connectionString;
    }
}

Myрепозиторий выглядит так:

   public class WebClientRepository : IWebClientRepository
    {
        private readonly WebClientDataClassesDataContext datacontext;
        private ILinqConfiguration _linqconfig;


        public WebClientRepository(ILinqConfiguration linqconfig)
        {

                _linqconfig = linqconfig;
                datacontext = new WebClientDataClassesDataContext(_linqconfig.GetConnectionString());
        }

    //....
    }

и привязка с использованием соглашений:

public class LinqRepositoryModule: NinjectModule
    {
        public override void Load()
        {
            Bind<ILinqConfiguration>()
            .To<LinqConfiguration>()
            .WithConstructorArgument("connectionString",
          ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString
            );

            IKernel ninjectKernel = this.Kernel;

            ninjectKernel.Scan(kernel =>
            {
                kernel.FromAssemblyContaining<IWebClientRepository>();
                kernel.FromAssemblyContaining<WebClientRepository>();
                kernel.Where(t => t != typeof(LinqConfiguration)); // interface is in the same assembly and it is already binded
                kernel.BindWithDefaultConventions();
                kernel.AutoLoadModules();
                kernel.InRequestScope();
            });

        }
    }
...