Ninject使用构造函数从AssembliesInPath加载

时间:2011-05-26 07:13:28

标签: constructor ninject ninject-extensions

如果我说代码有这样的作用:

    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 :(得分:0)

在我进入某些存储库的项目中,我传递了ISession(nHibernate),并将其传递给了其他用于DataContext的连接字符串(Linq2SQL)

要传递连接字符串,我已经创建了LinqConfiguration类

public class LinqConfiguration : ILinqConfiguration
{
    private readonly string _connectionString;

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

    public string GetConnectionString()
    {
        return _connectionString;
    }
}

我的存储库看起来像这样:

   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();
            });

        }
    }
相关问题