- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Autofac 将依赖项注入(inject)到 MVC 4 应用程序中的 FluentValidation 中。我想我已经制定了策略,但是我一直无法解决我的单例请求 ISomething。
这是场景:
我有一个从 FluentValidation 的 AbstractValidator 派生的验证器。我读过 FluentValidation 验证器作为单例执行得最好,所以我的构造函数需要一个 Func 并存储该 Factory 以供以后使用。使用验证器时,它应该向存储的工厂请求 IDataStore,获取为该请求创建的实例并使用它。这就是理论。我想感谢 https://github.com/robdmoore/UnobtrusiveMVCTechniques ,这帮助我解决了这个解决方案。这是验证器...
public class SiteAdminViewModelValidator : AbstractValidator<SiteAdminViewModel> {
private readonly Func<IDataStore> _dbFactory;
public SiteAdminViewModelValidator(Func<IDataStore> dbFactory) {
_dbFactory = dbFactory;
RuleFor(model => model.SiteCode).Length(1, 40).Must(BeSpecial);
}
public bool BeSpecial(string siteCode) {
var db = _dbFactory();
List<Stuff> stuffs = db.All<Stuff>().ToList();
return true;
}
}
public class FluentValidatorModule : Module {
protected override void Load(ContainerBuilder builder) {
base.Load(builder);
builder.RegisterType<AutofacValidatorFactory>().As<IValidatorFactory>().SingleInstance();
var validators = AssemblyScanner.FindValidatorsInAssembly(System.Reflection.Assembly.GetExecutingAssembly());
validators.ToList().ForEach(v => builder.RegisterType(v.ValidatorType).As(v.InterfaceType).SingleInstance());
}
}
builder.RegisterType<SuperDB>().As<IDataStore>().InstancePerHttpRequest();
builder.Register<Func<IDataStore>>(c => {
var context = c.Resolve<IComponentContext>();
return context.Resolve<IDataStore>;
});
No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
最佳答案
我同意这应该可行 - Func<IDataStore>
正在定义一个工厂,它将根据需要在每个方法中生成依赖项。
我绕过这种方法的方法是使用 DependencyResolver.Current
就像错误消息所暗示的那样。主要原因是我已经使用 Autofac.Mvc4 nuget 包进行了设置...
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
public Func<T> PerHttpSafeResolve<T>()
{
return () => DependencyResolver.Current.GetService<T>();
}
builder.RegisterType<SuperDB>().As<IDataStore>().InstancePerHttpRequest();
builder.RegisterInstance(PerHttpSafeResolve<IDataStore>());
Func<IDataStore>
然后使用传递给方法的值。
PerHttpSafeResolve<IDataStore>
的结果只是一个函数(工厂),因此它可以作为单个实例存在。
关于inversion-of-control - Autofac - 如何从单例中解析 ISomething 的 Func,其中 ISomething 是 InstancePerHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15538665/
我正在尝试使用 Autofac 将依赖项注入(inject)到 MVC 4 应用程序中的 FluentValidation 中。我想我已经制定了策略,但是我一直无法解决我的单例请求 ISomethin
我偶然发现了一份文档,其中 COM 对象有两种接口(interface),一种以 I 开头,第二种以 IX 开头。文档说 IX 派生自 IUnknown,而 I 派生自 IDispatch。 如果我使
这个问题在这里已经有了答案: What do you call it when one interface "inherits" from another? (6 个答案) 关闭 6 年前。 如果这
我有一个带有 Start 方法的接口(interface) ISomething。我想获得这个接口(interface)的所有实现(在多个程序集中,主要的和所有引用的)并在应用程序启动时调用 Star
我有一个接口(interface) ISomething 和一个方法 Start。我想获得这个接口(interface)的所有实现(在多个程序集中,主要的和所有引用的)并在应用程序启动时调用 Star
我有一个 F# 片段没有正确输入。我猜我需要将 'a1 和 'b1 限制为 ISomething 但我不知道如何。有两个错误,都在底线上。 f 和 g 在 RHS 上的使用带有下划线,错误消息如下:
所以,这是一个比较迟钝的问题,但让我看看我是否可以相对简单地列出它。假设我有以下界面: public interface IFoo { ICollection Bars { get; set;
使用 I 作为接口(interface)名称前缀的 .NET 标准似乎越来越普遍,并且不再仅限于 .NET。我遇到过很多使用这种约定的 Java 代码(所以如果 Java 在 C# 之前使用它,我不会
我有一个类Something实现 ISomething .如何从 IQueryable 转换/转换到 IQueryable .当我尝试转换时,我能够编译,但转换的结果始终为 NULL。 背景:我这样做
我希望以这样的方式声明一个变量,因为它只能分配从 Control 派生的值并且还实现 ISomething 接口(interface)。 我打算将 ISomething 接口(interface)添加
这可能是一个非常简单的问题,但有些东西对我来说没有意义。 给定这个类: public class Person : ICloneable { public object Clone()
我是一名优秀的程序员,十分优秀!