我正在尝试使用Autofac将依赖项注入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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以指出我正在努力完成的工作示例,那就太棒了,但我也想知道这个特定Autofac诡计的解决方案.
这是我的验证员注册...
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());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在IDataStore工厂的注册......
builder.RegisterType<SuperDB>().As<IDataStore>().InstancePerHttpRequest();
builder.Register<Func<IDataStore>>(c => {
var context = c.Resolve<IComponentContext>();
return context.Resolve<IDataStore>; …Run Code Online (Sandbox Code Playgroud) 是否有热键或加载项/插件允许我将光标放在Visual Studio 2010中的文本中,并将我带到实际的"显示项目"或至少告诉我哪些显示项目在该文本上"处于活动状态" ?
大多数时候我不知道显示项目名称会改变我在编辑器中看到的内容.我目前只是寻找我在编辑器中看到的前景色和背景色,因为我循环浏览了无数的显示项目.
我知道这是一厢情愿的想法,但如果我可以直接找到正确的显示项目或至少看到光标所在文本的名称,它会使定制颜色更容易.
我有一个服务,PageService,我测试这样(简化)...
var database = require("../database/database");
var PageService = require("./pageService");
describe("PageService", function () {
var pageService = {};
before(function (done) {
pageService = new PageService(database);
}
it("can get all Pages", function (done) {
pageService.getAll(function (err, pages) {
if (err) return done(err);
pages.should.be.instanceOf(Array);
pages.length.should.be.greaterThan(1);
done();
});
});
Run Code Online (Sandbox Code Playgroud)
我一直在努力使用bluebird来宣传所有悬挂在PageService上的方法(getAll,getById,create,update,delete等).我已经看了几个关于这个主题的讨论,但大多数似乎都在关注试图让构造者返回一个承诺.我只想通过构造函数来宣传我创建的类中的所有函数.它是pageService = new PageService(数据库); 我无法通过宣传.
PageService只使用基本的构造函数模式 - 例如
self.getAll = function(next) {
self.collection.find({}, function(err, docs) {
if (err) return next(err);
next(null, docs);
});
};
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我正确的方法来轻松地从构造函数返回的对象上挂起所有函数,我会很感激.我也很乐意接受这样一个事实:我可能以错误的方式这样做.我对一般的承诺很新,并欢迎指导.
我通过以下方式获得了承诺的功能......
pageService = new PageService(database);
Promise.promisifyAll(pageService);
Run Code Online (Sandbox Code Playgroud)
......但每次我新建一个服务实例时,这都是一种不好的做法.我想要一种方式来宣传一次,只有一次.我认识到手动返回服务中的promises可能是解决方案,但希望通过bluebird magic更优雅.
我正在尝试将asp.net mvc与angular 2应用程序集成.我知道这并不理想,但我被要求将一些现有的Mvc功能(想想大遗留应用程序)整合到一个全新的Angular 2水疗中心.
我想要做的是有一个cshtml视图,其中包含角度组件,以及纯mvc的东西......
<side-bar></side-bar>
<action-bar></action-bar>
@{
Html.RenderPartial("_SuperLegacyPartialView");
}
Run Code Online (Sandbox Code Playgroud)
我很难找到任何方法来做到这一点.这篇博文看起来很有前途 - http://www.centare.com/tutorial-angular2-mvc-6-asp-net-5/.它使用了一个指向由Mvc和AsyncRoute呈现的路径的templateUrl值,但是在Angular 2中它们都不再有效.这篇文章看起来很有前途 - http://gbataille.github.io/2016/02/ 16/Angular2-Webpack-AsyncRoute.html,但它也使用AsyncRoute,不推荐使用.
这在Angular 1中非常容易.我们曾经手动将角度引导到Razor视图中,或者将局部视图渲染为组件/指令的templateUrl.在使用Webpack的最新Angular 2中执行此操作的最佳方法是什么?
我正在尝试在NodeJS中的自执行函数中分配构造函数.我很确定它不起作用,因为我的参数是一个指向module.exports的变量,但我很好奇是否有办法使其工作,同时保持尽可能接近自执行格式.
这是代码被调用的方式......
var TemplateEngine = require('./templateEngine');
templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function"
Run Code Online (Sandbox Code Playgroud)
这是一个很好的代码示例...
var assert = require('assert');
var swig = require('swig');
// Constructor
var TemplateEngine = function(args) {
assert.ok(args.engine, 'engine is required');
var templateEngine = {};
templateEngine.engine = args.engine;
templateEngine.Render = function(templateString, model) {
var result = swig.render(templateString, model);
return result;
};
return templateEngine;
};
module.exports = TemplateEngine;
Run Code Online (Sandbox Code Playgroud)
这里是我想要使用的代码样式的一个例子,但它产生了一个"TypeError:Object is not function"错误,因为我实际上并没有分配给module.exports,只是一个复制它所指向的任何变量的变量至.
(function(templateEngine) {
var assert = require('assert');
var swig = require('swig');
templateEngine = function(args) …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来理解NodeJ.我显然缺少一些基本的东西.我有一个类似于以下的模块,使用基本的显示模块模式...
var someArray = [];
var publicApi = {
someArray: someArray,
someFunction: someFunction
};
function someFunction() {
someArray = ['blue', 'green'];
}
module.exports = publicApi;
Run Code Online (Sandbox Code Playgroud)
当我使用这个模块时,someArray在我调用someFunction时没有改变...
var myModule = require('myModule');
myModule.someFunction();
var test = myModule.someArray;
// test is always an empty array
Run Code Online (Sandbox Code Playgroud)
请帮我理解原因.我意识到我可以使用构造函数来使用它,但我想填补我的知识,为什么以上不起作用.
更新:
我可以通过以下对模块的修改来实现这一点......
var theModule = {
someArray: [],
someFunction: someFunction
};
function someFunction() {
theModule.someArray = ['blue', 'green'];
}
module.exports = theModule;
Run Code Online (Sandbox Code Playgroud)
但我仍然想明白为什么第一个模块中的代码不起作用.我正在处理的模块很好,作为一个单例,所以我很想看看在模块中有变量的最佳实践是什么,可以通过该模块中的函数进行更改,并且可以在该模块之外公开访问.
我希望得到如下服务
public SomeService(IMongoDatabase mongoDatabase) {
DB = mongoDatabase;
}
Run Code Online (Sandbox Code Playgroud)
我想使用工厂来解决IMongoDatabase,只是为了封装IConfiguration用法
public static IMongoDatabase GetMongoDatabase(IConfiguration config)
{
var connectionString = config.Get("SomeConnectionString");
// MongoClient handles connection pooling internally
var client = new MongoClient(connectionString);
var db = client.GetDatabase(config.Get("SomeDbName"));
return db;
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何处理注册,以便MongoDbFactory.GetMongoDatabase在任何类需要时调用IMongoDatabase.IConfiguration将被注册.
我真的很想在我的服务中使用一个IMongoDatabase而不是一个Func<IConfiguration, IMongoDatabase>.后者似乎过于迟钝,要求消费者实施我应该能够为他们实施的步骤.
我有一个可观察的数据服务(UserService),它返回当前登录的用户.我遵循了本教程 - https://coryrylan.com/blog/angular-observable-data-services,它描述了使用BehaviorSubject立即返回默认的currentUser,然后在加载或更改后发出真正的currentUser.服务基本上就像这样......
private _currentUser: BehaviorSubject<User> = new BehaviorSubject(new User());
public currentUser: Observable<User> = this._currentUser.asObservable();
constructor(private http: Http) {}
loadUser() { // app.component onInit and login component call this
return this.http.get('someapi.com/getcurrentuser')
.map(response => <User>this.extractData(response))
.do(
(user) => {
this.dataStore.currentUser = user;
this._currentUser.next(Object.assign(new User(), this.dataStore).currentUser);
},
(error) => this.handleError(error)
)
.catch(error -> this.handleError(error));
}
Run Code Online (Sandbox Code Playgroud)
当用户点击F5重新加载整个水疗中心时,我遇到了问题.当消费组件订阅UserService上的currentUser时,它会立即收到默认用户,而UserService等待api调用以接收实际用户.api调用完成的那一刻,真实用户由UserService发出,所有订阅者都获得真实用户.但是,BehaviorSubject发出的第一个值是默认值,它的id始终为"undefined",因此我们无法进行下一次api调用.实际上,当真实用户通过并且我可以使用user.id进行有效调用时,链接的订阅永远不会发生,并且我没有从响应中获取值.
我知道我做的事情很愚蠢,但我还没弄清楚到底是什么.我偶然发现了concatMap,但我不确定如何使用它.当我追求这一点时,我想知道为什么以下代码不起作用.我特别想知道为什么即使真正的用户进来之后订阅也永远不会激发,只是为了帮助我的新手了解Observables.
this.userService.currentUser
.flatMap((user) => {
this.user = user;
// Need to NOT call this if the user does not have an id!!!
this.someOtherService.getSomethingElse(user.id); // user.id …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ui-router使用嵌套的命名视图来实现一个非常简单的示例,我无法使其工作.如果有人能看到这个jsFiddle - http://jsfiddle.net/thardy/eD3MU/ - 告诉我我做错了什么,我会非常感激.
基本思路是这样的: - 我的index.html有一个单独的ui-view - 插入的模板有两个名为ui-views的模板 - 我正在尝试设置配置,用模板填充这两个ui-views我无法让它发挥作用
这是小提琴的核心(模板中的尖括号替换为[]):
$stateProvider
.state('test', {
url: '/test',
views: {
'main': {
template: '[h1]Hello!!![/h1]' +
'[div ui-view="view1"][/div]' +
'[div ui-view="view2"][/div]'
}
}
})
.state('test.subs', {
url: '',
views: {
'view1': {
template: "Im View1"
},
'view2': {
template: "Im View2"
}
}
});
Run Code Online (Sandbox Code Playgroud)
我现在已经调整了好几个小时(尝试绝对名字等),我即将发疯.根据文档(至少对我来说)它看起来不错,但是没有任何简单的例子,我必须遗漏一些明显的东西.
更新 通过从测试状态中删除url并将url:''添加到test.subs状态,它可以正常工作.但是将任何url添加到测试状态会导致它再次失败.在我的真实场景中,这些状态都不在根,并且在父状态中根本没有url会导致事情无法正常工作.这就像是没有激活状态或其他东西.根据文档,在sub中使用url:''会导致它与其父状态一起被激活,但这不是正在发生的事情.
更新 - 解决方案 对于任何想要看到它的人 - http://jsfiddle.net/thardy/eD3MU/
我创建了一个自动生成器 - generator-ngbp并将其发布到npm.你可以通过安装它
npm install -g generator-ngbpRun Code Online (Sandbox Code Playgroud)
通过npm链接在本地工作时,一切运行良好,包括"模块"子生成器
yo ngbp:module "moduleName"Run Code Online (Sandbox Code Playgroud)
当我删除nodejs下的链接node_modules文件夹并从npm如上所述安装它时,generator-ngbp的node_modules文件夹不包含容纳子生成器的"module"文件夹,并且"module"子生成器不起作用.
谁能看到我做错了什么?它与npm发布有关吗?
javascript ×3
node.js ×3
autofac ×2
angular ×1
angularjs ×1
asp.net-mvc ×1
bluebird ×1
c# ×1
chain ×1
closures ×1
colors ×1
constructor ×1
factory ×1
npm ×1
observable ×1
promise ×1
rxjs ×1
webpack ×1
yeoman ×1