Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject/NHibernate配置多个数据库;绑定到提供程序Ninject.Web.MVC3和.NET 4.5时,可以使用多个绑定_C#_Asp.net Mvc_Nhibernate_Ninject_Ninject.web.mvc - Fatal编程技术网

C# Ninject/NHibernate配置多个数据库;绑定到提供程序Ninject.Web.MVC3和.NET 4.5时,可以使用多个绑定

C# Ninject/NHibernate配置多个数据库;绑定到提供程序Ninject.Web.MVC3和.NET 4.5时,可以使用多个绑定,c#,asp.net-mvc,nhibernate,ninject,ninject.web.mvc,C#,Asp.net Mvc,Nhibernate,Ninject,Ninject.web.mvc,我在尝试向混音中添加第二个db连接时遇到问题 错误: NinjectConfigurator.cs 当我注释掉sybase db的绑定时,我没有得到任何错误。我试图在ISessionFactory的绑定上设置一个条件.WhenClassHas,但没有效果 ... container.Bind<ISessionFactory>().ToProvider<MsSqlSessionFactoryProvider>().InSingletonScope().Named("mssq

我在尝试向混音中添加第二个db连接时遇到问题

错误: NinjectConfigurator.cs 当我注释掉sybase db的绑定时,我没有得到任何错误。我试图在ISessionFactory的绑定上设置一个条件.WhenClassHas,但没有效果

...
container.Bind<ISessionFactory>().ToProvider<MsSqlSessionFactoryProvider>().InSingletonScope().Named("mssql");
container.Bind<ISession>().ToProvider<MsSqlSessionProvider>().WhenClassHas<MsSqlNhibernateSessionAttribute>().InRequestScope();

container.Bind<ISessionFactory>().ToProvider<SybaseSessionFactoryProvider>().InSingletonScope().Named("sybase");
container.Bind<ISession>().ToProvider<SybaseSessionProvider>().WhenClassHas<NhibernateSessionAttribute>().InRequestScope();

container.Bind<ICurrentSessionContextAdapter>().To<CurrentSessionContextAdapter>();
...
ActionTransactionHelper.cs WhenClassHas绑定检查绑定类型Y被注入的类X中的属性Z

例如,当您有一个绑定

Bind<IFoo>().To<Foo>().WhenClassHas<MarkerAttribute>();
这就满足了条件

然而,鉴于:

public class ZZZ
{
    public ZZZ(IFoo foo) ..
}

[Marker]
public class YYY {
    public YYY(ZZZ zzz) ..
}
这不符合条件。IFoo被注入到没有[Marker]属性的ZZZ中


此外,当注入[Marker]属性本身时,这不满足条件,因为[Marker]属性本身的类声明中没有[Marker]属性。

我找到了解决问题的方法。感谢@BatteryBackupUnit的帮助。最后,我不得不在ActionTransactionHelper中用[Namedcorresponding name from NinjectConfiguration binding to ISessionFactory]装饰我的ISessionFactory注入

例如: 在配置文件中使用.Namedname

container.Bind<ISessionFactory>().ToProvider<MsSqlSessionFactoryProvider>().InSingletonScope().Named("mssql");

请同时显示它注入的类的代码和完整的代码!属性的代码。@BatteryBackupUnit,添加了这些。当我试图开始工作时,我发现每次我在ISessionFactory的绑定上添加.WhenClassHas时,它都不会通过NinjectConfigurator触发。因为这永远不会发生,所以SessionFactory永远不会绑定到内核。我做的装订不对吗?
public class SybaseSessionProvider : Provider<ISession>
{
    protected override ISession CreateInstance(IContext context)
    {
        var sessionFactory = context.Kernel.Get<ISessionFactory>("sybase");
        if (!CurrentSessionContext.HasBind(sessionFactory))
        {
            var session = sessionFactory.OpenSession();
            CurrentSessionContext.Bind(session);
        }
        return sessionFactory.GetCurrentSession();
    }
}
using System.Web.Mvc;

namespace Common
{
    public class MsSqlNhibernateSessionAttribute : ActionFilterAttribute/*, IActionFilter*/
    {
        private readonly IActionTransactionHelper _actionTransactionHelper;
        private readonly IActionExceptionHandler _actionExceptionHandler;

        public MsSqlNhibernateSessionAttribute()
            : this(WebContainerManager.Get<IActionTransactionHelper>(),
                  WebContainerManager.Get<IActionExceptionHandler>())
        {
        }

        public MsSqlNhibernateSessionAttribute(
            IActionTransactionHelper actionTransactionHelper,
            IActionExceptionHandler actionExceptionHandler)
        {
            _actionTransactionHelper = actionTransactionHelper;
            _actionExceptionHandler = actionExceptionHandler;
        }

        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {
            _actionTransactionHelper.BeginTransaction();
        }

        public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
        {
            _actionTransactionHelper.EndTransaction(actionExecutedContext);
            _actionTransactionHelper.CloseSession();
            _actionExceptionHandler.HandleException(actionExecutedContext);
        }
    }
}
using System.Web.Mvc;

namespace Common
{
    public class NhibernateSessionAttribute : ActionFilterAttribute
    {
        private readonly ISybaseActionTransactionHelper _sybaseActionTransactionHelper;
        private readonly IActionExceptionHandler _actionExceptionHandler;

        public NhibernateSessionAttribute()
            : this(WebContainerManager.Get<ISybaseActionTransactionHelper>(),
                  WebContainerManager.Get<IActionExceptionHandler>())
        {
        }

        public NhibernateSessionAttribute(
            ISybaseActionTransactionHelper actionTransactionHelper,
            IActionExceptionHandler actionExceptionHandler)
        {
            _sybaseActionTransactionHelper = actionTransactionHelper;
            _actionExceptionHandler = actionExceptionHandler;
        }

        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {
            _sybaseActionTransactionHelper.BeginTransaction();
        }

        public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
        {
            _sybaseActionTransactionHelper.EndTransaction(actionExecutedContext);
            _sybaseActionTransactionHelper.CloseSession();
            _actionExceptionHandler.HandleException(actionExecutedContext);
        }
    }
}
using System.Web.Mvc;
using Common;
using Data.SqlServer;
using NHibernate;
using Warehouse.Actions;
using Warehouse.Actions.VendorManagement;

namespace Warehouse.Controllers
{
    [MsSqlNhibernateSession]
    public class VendorManagementController : Controller
    {
        private readonly ISession _session;

        public VendorManagementController(ISession session) 
        {
            _session = session;
        }

        // GET: Vendor
        public ActionResult Index()
        {
            ViewVendorManagementAction viewVendorManagementAction = new ViewVendorManagementAction();
            return viewVendorManagementAction.Create(_session);
        }

        public ActionResult Vendor(Vendor vendor)
        {
            ViewVendorFormAction viewVendorFormAction = new ViewVendorFormAction();
            return viewVendorFormAction.Create(Request, _session);
        }

        public ActionResult SaveVendor(Vendor vendor)
        {
            SaveVendorAction saveVendorAction = new SaveVendorAction(_session);
            var newVendor = saveVendorAction.Save(vendor);
            var returnUrl = Url.Action("Vendor") + "?Id=" + newVendor.Id;
            return Redirect(returnUrl);
        }

        public ActionResult UpdateVendor(Vendor vendor)
        {
            UpdateVendorAction updateVendorAction = new UpdateVendorAction(_session);
            updateVendorAction.Update(vendor);
            var returnUrl = Url.Action("Vendor") + "?Id=" + vendor.Id;
            return Redirect(returnUrl);
        }
    }
}
using System.Web.Mvc;
using NHibernate;

namespace Common
{
    public class ActionTransactionHelper : IActionTransactionHelper
    {
        private readonly ISessionFactory _sessionFactory;
        private readonly ICurrentSessionContextAdapter _currentSessionContextAdapter;

        public ActionTransactionHelper(
            ISessionFactory sessionFactory,
            ICurrentSessionContextAdapter currentSessionContextAdapter)
        {
            _sessionFactory = sessionFactory;
            _currentSessionContextAdapter = currentSessionContextAdapter;
        }

        public void BeginTransaction()
        {
            var session = _sessionFactory.GetCurrentSession();

            if (session != null)
            {
                session.BeginTransaction();
            }
        }

        public bool TransactionHandled { get; private set; }

        public void EndTransaction(ActionExecutedContext filterContext)
        {
            var session = _sessionFactory.GetCurrentSession();
            if (session == null) return;
            if (!session.Transaction.IsActive) return;

            if (filterContext.Exception == null)
            {
                session.Flush();
                session.Transaction.Commit();
            }
            else
            {
                session.Transaction.Rollback();
            }

            TransactionHandled = true;
        }

        public bool SessionClosed { get; private set; }

        public void CloseSession()
        {
            if (_currentSessionContextAdapter.HasBind(_sessionFactory))
            { 
                var session = _sessionFactory.GetCurrentSession();
                session.Close();
                session.Dispose();
                _currentSessionContextAdapter.Unbind(_sessionFactory);

                SessionClosed = true;
            }
        }
    }
}
Bind<IFoo>().To<Foo>().WhenClassHas<MarkerAttribute>();
[Marker]
public class Bar {
    public Bar(IFoo foo) ...
}
public class ZZZ
{
    public ZZZ(IFoo foo) ..
}

[Marker]
public class YYY {
    public YYY(ZZZ zzz) ..
}
container.Bind<ISessionFactory>().ToProvider<MsSqlSessionFactoryProvider>().InSingletonScope().Named("mssql");
public class ActionTransactionHelper : IActionTransactionHelper
{
        private readonly ISessionFactory _sessionFactory;
        private readonly ICurrentSessionContextAdapter _currentSessionContextAdapter;

        public ActionTransactionHelper(
            [Named("mssql")] ISessionFactory sessionFactory,
            ICurrentSessionContextAdapter currentSessionContextAdapter)
        {
            _sessionFactory = sessionFactory;
            _currentSessionContextAdapter = currentSessionContextAdapter;
        }
}