小编Ste*_*ven的帖子

为什么会在内置的ASP.NET Core DI Container上使用第三方DI Container?

目前缺乏关于DI主题的文档 - 依赖注入.有人可以帮我理解以下内容:

  1. 这些注册有什么区别?

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IService, Service>();
        services.AddScoped<IService, Service>();
        services.AddSingleton<IService, Service>();
        services.AddInstance(service);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用内置DI优于现有解决方案(NInject,Autofac,Structure Map)的优缺点是什么?
  3. 默认依赖注入的当前限制是什么(如果有的话)?

asp.net dependency-injection asp.net-core

40
推荐指数
4
解决办法
1万
查看次数

我应该使用哪种依赖注入工具?

我正在考虑在用户界面中使用Microsoft Unity作为我的依赖注入工具.

我们的中间层已经使用Castle Windsor,但我认为我应该坚持使用Microsoft.

有没有人对最好的依赖注入工具有什么想法?

.net dependency-injection castle-windsor ioc-container inversion-of-control

37
推荐指数
4
解决办法
1万
查看次数

使用Quartz.NET和Simple Injector进行构造函数注入

目前我正在使用Quartz.NET编写一个服务来安排它的运行.

我想知道是否有人有任何使用Quartz.NET和Simple Injector构造函数注入的经验.

以下基本上是我希望实现的目标

public class JobImplementation: IJob
{
    private readonly IInjectedClass injectedClass;

    public JobImplementation(IInjectedClass _injectedClass)
    {
         injectedClass = _injectedClass
    }

    public void Execute(IJobExecutionContext _context)
    {
        //Job code
    }
Run Code Online (Sandbox Code Playgroud)

.net c# dependency-injection quartz.net simple-injector

36
推荐指数
1
解决办法
2万
查看次数

Castle Windsor - 开放通用接口的IoC注册?

Castle Windsor是否允许注册开放的通用接口,还是需要单独注册每个可能的类型实例?

示例 - 下面的类型为T,Z在编译时失败,除非我单独指定强类型的T,Z.

 container.Register(Component
      .For<IAdapterFactory<T,Z>>()
      .ImplementedBy<AdapterFactory<T,Z>>()
      .LifeStyle.PerWebRequest);
Run Code Online (Sandbox Code Playgroud)

.net c# castle-windsor ioc-container inversion-of-control

35
推荐指数
1
解决办法
1万
查看次数

.NET实体框架和事务

作为实体框架的新手,我真的很痴迷于如何处理这一系列问题.在我目前正在进行的项目中,整个站点与EF模型高度集成.首先,使用依赖注入引导程序控制对EF上下文的访问.出于操作原因,我们无法使用DI库.我删除了它并在需要时使用了上下文对象的各个实例的模型.我开始得到以下异常:

"XXX"类型已多次映射.

我们得出结论,背景的不同实例导致了这个问题.然后,我将上下文对象抽象为一个静态实例,每个线程/页面都访问该实例.我现在得到关于交易的几个例外之一:

不允许新事务,因为会话中正在运行其他线程.

无法执行事务操作,因为存在处理此事务的待处理请求.

当分配给命令的连接处于挂起的本地事务中时,ExecuteReader要求该命令具有事务.该命令的Transaction属性尚未初始化.

最后一个异常发生在加载操作上.我没有尝试将上下文状态保存回失败的线程上的Db.然而,有另一个线程执行这样的操作.

这些例外情况最多是间歇性的,但我设法让网站进入一个由于事务锁定而拒绝新连接的状态.不幸的是我找不到异常细节.

我想我的第一个问题是,EF模型是否应该从静态单个实例中使用?此外,是否可以消除EF中的交易需求?我试过使用一个TransactionScope没有成功的对象......

说实话,我在这里很多,并且无法理解为什么(应该是什么)相当简单的操作导致这样的问题......

.net entity-framework sql-server-2005

32
推荐指数
2
解决办法
2万
查看次数

验证:如何使用Ninject注入模型状态包装器?

我正在查看本教程http://asp-umb.neudesic.com/mvc/tutorials/validating-with-a-service-layer--cs,了解如何围绕包装器包装我的验证数据.

我想使用依赖注入.我正在使用ninject 2.0

namespace MvcApplication1.Models
{
    public interface IValidationDictionary
    {
        void AddError(string key, string errorMessage);
        bool IsValid { get; }
    }
}
Run Code Online (Sandbox Code Playgroud)

//包装

using System.Web.Mvc;

namespace MvcApplication1.Models
{
    public class ModelStateWrapper : IValidationDictionary
    {

        private ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelState)
        {
            _modelState = modelState;
        }

        #region IValidationDictionary Members

        public void AddError(string key, string errorMessage)
        {
            _modelState.AddModelError(key, errorMessage);
        }

        public bool IsValid
        {
            get { return _modelState.IsValid; }
        }

        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)

//控制器

private IProductService _service;

public ProductController() 
{ …
Run Code Online (Sandbox Code Playgroud)

c# ninject ioc-container modelstate asp.net-mvc-2

32
推荐指数
1
解决办法
1万
查看次数

C#编译器不会优化不必要的强制转换

几天前,虽然在溢出时写了这个问题的答案,我对C#编译器感到有些惊讶,他没有做我预期的事情.请查看以下代码片段:

第一:

object[] array = new object[1];

for (int i = 0; i < 100000; i++)
{
    ICollection<object> col = (ICollection<object>)array;
    col.Contains(null);
}
Run Code Online (Sandbox Code Playgroud)

第二:

object[] array = new object[1];

for (int i = 0; i < 100000; i++)
{
    ICollection<object> col = array;
    col.Contains(null);
}
Run Code Online (Sandbox Code Playgroud)

两个片段之间代码的唯一区别是对ICollection <object>的强制转换.因为object []显式地实现了ICollection <object>接口,所以我期望这两个片段编译成相同的IL,因此是相同的.然而,当对它们进行性能测试时,我注意到后者的速度是前者的6倍.

在比较两个片段中的IL之后,我注意到两种方法都是相同的,除了第一个片段中的castclass IL指令.

对此感到惊讶,我现在想知道为什么C#编译器在这里并不"聪明".事情从来没有像看起来那么简单,为什么C#编译器在这里有点天真?

c# compiler-construction performance cil

30
推荐指数
1
解决办法
1018
查看次数

使用Autofac注册通用类型

我有UnitofWork类,它实现了IUnitOfWork.我试着用autofac注册:

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<Repository<>,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();
Run Code Online (Sandbox Code Playgroud)

实施是:

public class UnitOfWork<T, O> : IUnitOfWork
    where T : Repository<O>
    where O : BaseEntity
{
}

public interface IUnitOfWork : IDisposable
{
    void SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

给出"预期类型"错误

但是这个工作在另一个项目上:

public class Repository<T> : GenericRepository<T> 
    where T : BaseEntity
{
    public Repository(IDbContext context)
        : base(context) { }   
}

public abstract class GenericRepository<T> 
    : IRepository<T>, IQueryable<T> where T : BaseEntity
{
}

builder
    .RegisterGeneric(typeof(Repository<>))
    .As(typeof(IRepository<>))
    .InstancePerHttpRequest();
Run Code Online (Sandbox Code Playgroud)

c# generics unit-of-work autofac

30
推荐指数
1
解决办法
4万
查看次数

使用SimpleInjector和SignalR

我认为使用我自己的IoC对SignalR非常简单,也许是; 我很可能做错了什么.这是我到目前为止的代码:

private static void InitializeContainer(Container container)
{

   container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>();
   // ... registrations like about and then:
   var resolver = new SimpleInjectorResolver(container);
   GlobalHost.DependencyResolver = resolver;
}
Run Code Online (Sandbox Code Playgroud)

然后我的班级:

public class SimpleInjectorResolver : DefaultDependencyResolver
{
    private Container _container;
    public SimpleInjectorResolver(Container container)
    {
        _container = container;
    }

    public override object GetService(Type serviceType)
    {
        return _container.GetInstance(serviceType) ?? base.GetService(serviceType);
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType) ?? base.GetServices(serviceType);
    }
}
Run Code Online (Sandbox Code Playgroud)

最终发生的事情是我得到一个IJavaScriptProxyGenerator无法解决的错误,所以我想,我会添加注册:

container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
    ConstructorSelector.MostParameters);
Run Code Online (Sandbox Code Playgroud)

但是还有其他一些人!我到达:

container.Register<IDependencyResolver, SimpleInjectorResolver>();
container.Register<IJavaScriptMinifier, NullJavaScriptMinifier>();
container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
    ConstructorSelector.MostParameters);
container.Register<IHubManager, …
Run Code Online (Sandbox Code Playgroud)

c# simple-injector signalr

27
推荐指数
3
解决办法
1万
查看次数

具有相同接口的多个实现的Autofac

我正在使用Autofac,并希望有多个接口实现.如何配置Autofac以便根据当前类型解析依赖关系?

更具体地说,我有一个接口和多个应该链接在一起的实现.

让我解释一下(虚拟课程):

public interface IMessageHandler
{
    void Handle(Message message);
}

public class LoggingMessageHandler : IMessageHandler
{
    private IMessageHandler _messageHandler;

    public LoggingMessageHandler(IMessageHandler messageHandler)
    {
        _messageHandler = messageHandler;
    }

    public void Handle(Message message) 
    {
        // log something
        _messageHandler.Handle(message);
    }
}

public class DoSomethingMessageHandler : IMessageHandler
{
    private IMessageHandler _messageHandler;

    public DoSomethingMessageHandler (IMessageHandler messageHandler)
    {
        _messageHandler = messageHandler;
    }

    public void Handle(Message message) 
    {
        // do something
        _messageHandler.Handle(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

链的底部可能是一个IMessageHandler不会将消息传递给下一个消息的链接.

如果我想要以下链:

TopLevelClass -> LoggingMessageHandler -> DoSomethingMessageHandler -> FinalHandler
Run Code Online (Sandbox Code Playgroud)

我怎么能告诉Autofac …

c# dependency-injection inversion-of-control autofac

24
推荐指数
3
解决办法
3万
查看次数