0

如果我说有这样的代码:

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

并且假设目标程序集中定义的每个类在构造函数中都有一个字符串参数,我将如何从上面的代码中传递字符串参数?

我是否改为使用拦截器?

在此先感谢,约翰

4

1 回答 1

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

        }
    }
于 2012-01-16T10:59:56.633 回答