我最近和IOC Containers(在我的案例中是LightInject)有点讨厌.
我一直在读你应该只需要在启动时使用容器ONCE,而不是在其他地方.这是我难以理解的.如果我只能在引导程序/启动方法中引用容器,那么如何在课程依赖于用户输入的情况下,如何在项目中或在运行时解析我需要的内容.
所以在我的传统Windows窗体应用程序中,在Form Load Say上,我会根据下面的代码启动Lightinject.这只是一个随意的例子,它更像是我需要解决的前提.
我可能完全错过了这里的东西,或者只是没有得到它.但是我应该如何解决依赖性,如果我不能使用/不应该引用或使用Container.GetInstance/Resolve/{选择IOC语法Here},并且仅在组合根目录中.
对于Instance,我说我的表单上有两个按钮和一个TextBox.第一个按钮给我一个ILoader(下面的代码),第二个按钮加载一个文件查看器(ILoader,代码下面),其文件名是输入winform上文本框的内容.
没有IOC容器我会做以下(让我们假设它放在click事件中)
按钮1单击事件:
ISplitText MyStringFunc = new WhateverImplementsIt();
Run Code Online (Sandbox Code Playgroud)
按钮2(根据文本框输入获取文件阅读器)
ILoader MyLoader = new FileReaderImplementation(TextBox1.Text);
Run Code Online (Sandbox Code Playgroud)
使用LightInject,我肯定不得不做以下事情:
Button1点击:
ISplitText Splitter = Container.GetInstance<ISplitText>();
Run Code Online (Sandbox Code Playgroud)
按钮2单击
var LoaderFunc = Container.GetInstance<Func<string, ILoader>>();
ILoader l2 = LoaderFunc(TextBox1.Text);
Run Code Online (Sandbox Code Playgroud)
我不正确吗?在一个大型项目中,我将拥有Container.GetInstance,遍布整个地方,在主窗体文件和其他地方,所以我怎么能只在引导程序的形式中仅在1个位置引用容器,我错过了一个魔法一块拼图?
在所有示例应用程序中,我看到它都是在一个简单的控制台应用程序中,在Main函数中完成的.所有这些应用程序遵循以下格式:
Container = new Container();
Container.Register<IFoo,Foo>();
Container.Register<IBar,Bar();
var Resolved = Container.GetInstance<IFoo>();
Run Code Online (Sandbox Code Playgroud)
嗯,我理解这一切,而且非常简单.一旦你开始为应用程序本身添加一些复杂性,我就失去了如何获取实例而不使Container本身公开,静态,或以某种方式,形状或形式访问然后调用Container.GetInstance在一百万个地方(显然,这是一个很大的否定).请帮忙!干杯,
CHUD
PS - 我并不担心"抽象容器"本身.所以我宁愿只专注于增加我对上述的理解.
public class BootStrapIOC
{
public ServiceContainer Container;
public BootStrapIOC(ServiceContainer container)
{
Container = container;
}
public void Start()
{
Container.Register<ISplitText, StringUtil>();
Container.Register<string, ILoader>((factory, value) => new …Run Code Online (Sandbox Code Playgroud) 运行.Net核心任务到打包.如何将输出的nuget包版本提供给Auto Increment本身,格式为:
1.0.0
所以下次我打包/推送时我想看1.0.1
我正在使用Build.BuildNumber的环境构建变量并在以下时刻获取输出:
20180913-.2.0等想要纠正更传统的版本控制系统
谢谢.
azure-devops azure-pipelines-build-task azure-pipelines azure-artifacts
我的 NetStandard 项目中有以下内容
<ItemGroup>
<PackageReference Include="MyReference" Version="1.0.*" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
当我将它更改为使用通配符(而不是 1.0.1)时,我会在依赖项切换上看到一个感叹号,然后是 NuGet 切换,当然还有包本身。
当我签入时,CI 构建也在另一端失败,给我
无法找到包 MyReference。源中不存在具有此 ID 的包:Microsoft Visual Studio 离线包,nuget.org
使用没有通配符的实际版本 (1.0.1) 时,上述所有问题都会消失,但我想确保 .NET Core 还原任务始终还原到最新包,我希望一个简单的通配符可以做到.
注意 - 我正在使用我自己的私有 NuGet 存储库(包管理扩展)
请指教。
为什么在 CI 构建期间使用通配符会失败,表明它找不到包?
因此,假设我已将 project1 部署到我自己的 NuGet 存储库。Project2 依赖于 Project1,它已作为 NuGet 包添加到 Project2。Project1 包驻留在我自己的存储库中,没有问题也没有错误。
当我使用通配符并在本地构建时,它可以工作并恢复最新版本。当我签入代码更改(在 .csproj 中保留通配符)时 - CI Build 失败并显示上述错误消息。
azure-devops azure-pipelines-build-task azure-pipelines azure-pipelines-release-pipeline packagereference
我有一些要反序列化的json。将序列反序列化很容易,但是我正在使用接口,这就是我需要反序列化的结果:
因此,让我们从一些JSON开始:
[{"TimeGenerated":"2017-05-30T19:21:06.5331472+10:00","OuterValue":1.08,"Identifier":{"IdentifierName":"BLA","IdentifierNumber":1},"Locale":{"LocaleName":"LOCALE NAME","LocaleType":1,"LocaleNumber":1,"StartTime":"2017-05-30T19:20:00+10:00"},"InnerValue":1.08,"InnerType":0,"InnerId":"InnerI","Type":"MyType","Id":"11111"}]Run Code Online (Sandbox Code Playgroud)
这是在服务器端进行序列化的数据(当然没有问题),其对象类型为:
IList<IRootObject>
Run Code Online (Sandbox Code Playgroud)
如此有效,我想反序列化为:
IList<IRootObject> MyDeserialisedObject = JsonConvert.Deserialise<IList<IRootObject>>(JsonString);
Run Code Online (Sandbox Code Playgroud)
显然,这里的泡菜是以下的旧界面/抽象类型错误:
'Could not create an instance of type BLA. Type is an interface or abstract class and cannot be instantiated'
Run Code Online (Sandbox Code Playgroud)
很好,我创建了一些自定义转换器,并进行了如下装饰:
类是:
[JsonObject(MemberSerialization.OptIn)]
public class Identifier
{
[JsonProperty]
public string IdentifierName { get; set; }
[JsonProperty]
public int IdentifierNumber { get; set; }
}
[JsonObject(MemberSerialization.OptIn)]
public class Locale
{
[JsonProperty]
public string LocaleName { get; set; }
[JsonProperty]
public int LocaleType { get; set; }
[JsonProperty]
public int LocaleNumber …Run Code Online (Sandbox Code Playgroud)