1

刚开始玩 ninject - 我无法解决这个问题。考虑这个设置:

private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<IDataTransaction>().To<DataTransaction>().InRequestScope();

   kernel.Bind<IdbAnalytics>().To<dbAnalytics>().InRequestScope();
   kernel.Bind<IdbMembership>().To<dbMembership>().InRequestScope();

   kernel.Bind<IAnalyticsWork>().To<AnalyticsWork>().InRequestScope();
   kernel.Bind<IMembershipWork>().To<MembershipWork>().InRequestScope();

   kernel.Bind<ILog>().To<Log>().InRequestScope();
   ...
}

将 Log 注入到上述类中:

public class AnalyticsWork : IAnalyticsWork, IDisposable
{
    private readonly IdbAnalytics _Context;
    private readonly ILog _Log;

    public AnalyticsWork(IdbAnalytics Context, ILog Log)
    {            
        _Context = Context;
        _Log = Log;
        _Log.Write(LogEntryType.DEBUG, "Object Created");
    }
    ...
}

这个问题是 Log 对象在其他对象(AnalyticsWork / MembershipWork)之前被处理掉了。有什么方法可以设置物品的处理顺序吗?还是这个设置有缺陷?

4

1 回答 1

2

我不使用 NInject,但在我看来,您正在将日志具体注册为共享或每个 Web 请求(根据InRequestScope可能表明的情况,我再次为不使用 NInject 表示歉意,所以我不确定它的作用)。

对于我使用过的所有记录器,NLog、Log4Net、MS 的日志记录应用程序块等 - 它们都需要Transient注册,而不是Scoped,因为它们将启动它们的超类作为调用类写入日志。

至于处置顺序,我认为您无法使用任何 IoC 容器来控制它,因为如果另一个类仍然具有依赖关系,则无法以不同的顺序处置该对象。几年前我第一次开始使用 IoC 容器时遇到了同样的问题,我想,“是的,我会将所有内容都注册为范围!” 嘿嘿,效果不是很好。

我会说你的对象只需要以不同的方式注册。只限定您真正需要限定范围的项目,其他所有内容为transientssingletons。我通常遵循以下模式:

编码一切singleton和编码thread-safe
如果不是线程安全的,请将其设置transient为 a 并注册它。

如果我没有unit-of-work在我ORMScoped.

于 2012-07-17T00:16:38.857 回答