我有一个JS代码,当你更改字段时,它会调用一个搜索例程.问题是,当Datepicker更新输入字段时,我找不到任何会触发的jQuery事件.
出于某种原因,当Datepicker更新字段时,不会调用更改事件.当弹出日历时,它会改变焦点,所以我也不能使用它.有任何想法吗?
由于dotnet核心移回到.csproj
格式,因此有一个新的自动生成MyProject.AssemblyInfo.cs
,其中包含.
[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)
请注意,每次构建时都会自动重新生成.以前该文件位于/ obj /目录中,现在它似乎只在内存中,因为在磁盘上找不到该文件并且单击错误消息不会打开任何文件.
由于它们在那里定义,我无法在经典中定义它们AssemblyInfo.cs
.
我在哪里/如何定义项目的公司和版本?
最近我读过Mark Seemann关于Service Locator反模式的文章.
作者指出ServiceLocator为反模式的两个主要原因:
API使用问题(我完全可以使用)
当类使用服务定位器时,很难看到它的依赖关系,因为在大多数情况下,类只有一个PARAMETERLESS构造函数.与ServiceLocator相比,DI方法通过构造函数的参数显式地暴露依赖关系,因此在IntelliSense中很容易看到依赖关系.
维护问题(让我感到困惑)
请考虑以下示例
我们有一个使用服务定位器方法的类'MyType':
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们要为类'MyType'添加另一个依赖项
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
// new dependency
var dep2 = Locator.Resolve<IDep2>();
dep2.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我的误解开始的地方.作者说:
要判断你是否引入了一个重大改变,要变得更加困难.您需要了解使用Service Locator的整个应用程序,并且编译器不会帮助您.
但是等一下,如果我们使用DI方法,我们将在构造函数中引入与另一个参数的依赖关系(在构造函数注入的情况下).问题仍然存在.如果我们忘记设置ServiceLocator,那么我们可能忘记在IoC容器中添加新的映射,并且DI方法将具有相同的运行时问题.
此外,作者还提到了单元测试的难点.但是,我们不会有DI方法的问题吗?我们不需要更新所有实例化该类的测试吗?我们将更新它们以传递一个新的模拟依赖项,以使我们的测试可编译.我没有看到更新和时间花费带来任何好处.
我不是想捍卫Service Locator方法.但这种误解让我觉得我失去了一些非常重要的东西.有人可以消除我的怀疑吗?
更新(摘要):
我的问题"服务定位器是反模式"的答案实际上取决于具体情况.我绝对不会建议你从工具列表中删除它.当您开始处理遗留代码时,它可能会变得非常方便.如果你很幸运能够处于项目的最初阶段,那么DI方法可能是更好的选择,因为它比Service Locator有一些优势.
以下是主要的不同之处,这些差异使我不相信我的新项目使用Service Locator:
有关详细信息,请阅读下面给出的优秀答案.
design-patterns dependency-injection anti-patterns service-locator
我有我的程序使用...各种常数string
的,int
的,double
的,等...什么是存储它们的最好方法?我不认为我想要一个Enum
,因为数据不是所有相同的类型,我想手动设置每个值.我应该把它们全部存放在一个空的课堂上吗?或者,还有更好的方法?
我正在编写一个从选择文件开始的小实用程序,然后我需要选择一个文件夹.我想将文件夹默认为所选文件所在的位置.
OpenFileDialog.FileName
返回完整的路径和文件名 - 我想要的只是获取路径部分(无文件名),所以我可以使用它作为初始选择的文件夹.
private System.Windows.Forms.OpenFileDialog ofd;
private System.Windows.Forms.FolderBrowserDialog fbd;
...
if (ofd.ShowDialog() == DialogResult.OK)
{
string sourceFile = ofd.FileName;
string sourceFolder = ???;
}
...
fbd.SelectedPath = sourceFolder; // set initial fbd.ShowDialog() folder
if (fbd.ShowDialog() == DialogResult.OK)
{
...
}
Run Code Online (Sandbox Code Playgroud)
有没有.NET方法可以做到这一点,还是我需要使用regex, split, trim,
等?
基本上,我有一个我想要修复的开放拉取请求,同时我想将包含2个功能的1个提交分成两个单独的提交.
Github存储库现在看起来像修复是一个新的分支:
master c-c-c
\
fix c-c-c-c
Run Code Online (Sandbox Code Playgroud)
我从修复中创建了一个pull请求.
我想将修复中的最后一次提交更改为本地存储库中的2次提交,如下所示:
master c-c-c
\
fix c-c-c-n-n
Run Code Online (Sandbox Code Playgroud)
其中nn是我的2个新提交.
为了在本地达到这一点,我这样做了:
1. git rebase -i HEAD~2
2. Changed my last commit line to "edit", saved and closed the file
3. git reset HEAD^
4. git stash save
5. Removed the changes I don't want in the first commit
6. git commit -m "commit a" -a
7. git stash apply
8. git commit -m "commit b"
Run Code Online (Sandbox Code Playgroud)
所以现在我按照我想要的方式进行了2次提交.问题是我发现了一个最终出现在pull请求中的错误.由于我已经推送到远程存储库,它不会接受我的新提交(因为原来的提交现在已经丢失).
我跑:
git push origin fix --dry-run
Run Code Online (Sandbox Code Playgroud)
我得到的消息是:
To git@github.com:<UserName>/<Repository>.git …
Run Code Online (Sandbox Code Playgroud) 我熟悉这些模式,但仍然不知道如何处理以下情况:
public class CarFactory
{
public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
{
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return new Car1(Dep1,Dep2,Dep3);
break;
case B:
return new Car2(Dep4,Dep5,Dep6);
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
通常,问题在于需要注入的引用量.当有更多的汽车时会更糟.
我想到的第一种方法是在工厂构造函数中注入Car1和Car2,但它违反工厂方法,因为工厂将始终返回相同的对象.第二种方法是注入servicelocator,但它的反模式到处都是.怎么解决?
替代方式1:
public class CarFactory
{
public CarFactory(IContainer container)
{
_container = container;
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return _container.Resolve<ICar1>();
break;
case B:
return _container.Resolve<ICar2>();
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
替代方式2(由于树中的依赖性过多而难以使用):
public class CarFactory
{
public CarFactory()
{
}
public ICar CreateCar(type)
{
switch(type)
{ …
Run Code Online (Sandbox Code Playgroud) c# dependency-injection inversion-of-control factory-pattern
我有一个格式如下的XML文件:
<Snippets>
<Snippet name="abc">
<SnippetCode>
testcode1
</SnippetCode>
</Snippet>
<Snippet name="xyz">
<SnippetCode>
testcode2
</SnippetCode>
</Snippet>
...
</Snippets>
Run Code Online (Sandbox Code Playgroud)
我可以使用XDocument成功加载元素,但是我在添加新元素时遇到了麻烦(有许多函数,我尝试过的大多数函数对我来说效果不好).怎么做?新元素将包含代码段名称标记和代码段代码标记.我以前的方法是打开文件,并使用字符串手动创建元素虽然有效,但这是一个非常糟糕的主意.
我尝试过的:
XDocument doc = XDocument.Load(spath);
XElement root = new XElement("Snippet");
root.Add(new XElement("name", "name goes here"));
root.Add(new XElement("SnippetCode", "SnippetCode"));
doc.Element("Snippets").Add(root);
doc.Save(spath);
Run Code Online (Sandbox Code Playgroud)
结果如下:
<Snippet>
<name>name goes here</name>
<SnippetCode>
code goes here
</SnippetCode>
</Snippet>
Run Code Online (Sandbox Code Playgroud)
它工作正常,但名称标签生成不正确.它应该是
<Snippet name="abc">
Run Code Online (Sandbox Code Playgroud)
但我无法正确生成.
我真的很喜欢这种新.csproj
格式.它比可怕的(有限的)好得多project.json
.
但是,有一件事我想解决.我已将我的(多个)测试项目合并到一个多目标项目中.
<TargetFrameworks>netcoreapp1.0;net40;net35</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
但是,在Visual Studio中的测试资源管理器中似乎没有任何工具来选择目标框架 - 它总是只运行第一个.我找到了一个解决方法 - 添加一个<TargetFramework>
具有特定框架的元素......
<TargetFramework>net35</TargetFramework>
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法选择目标框架而不需要手工编辑MSBuild(.csproj
)文件?我正在寻找GUI中的一些选项来执行此操作 - 特别是因此我不必记住编辑.csproj
文件以便在调试测试之前切换框架或记住在发布之前必须删除此行.
我想知道我是否可以轻松地在.NET Standard 2.0项目中设置我的EntityFrameworkCore.我正在阅读本教程,但它需要.NET Core或Framework.
当我到达这一步时:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
启动项目'projectName'的目标是框架'.NETStandard'.没有与此框架关联的运行时,并且无法直接执行以其为目标的项目.要将Entity Framework核心软件包管理器控制台工具与此项目一起使用,请添加一个针对引用此项目的.NET Framework或.NET Core的可执行项目,并将其设置为启动项目; 或者,更新此项目以跨目标.NET Framework或.NET Core.
我想知道我是否可以在.NET Standard中设置我的实体,或者是否有我应该做的最佳实践?