C# 当我想简单地新建一个元素或使用XAML创建它时,它们是克服DI限制的方法吗?
我正在使用:C# 当我想简单地新建一个元素或使用XAML创建它时,它们是克服DI限制的方法吗?,c#,.net,xamarin,xamarin.forms,dependency-injection,C#,.net,Xamarin,Xamarin.forms,Dependency Injection,我正在使用: Microsoft.Extensions.DependencyInjectionVersion5.0.1NuGet软件包,我正在创建一个名为ArrowGrid的类,该类创建一些图形元素 我想用C#和可能的XAML调用这样的类: var arrowGrid = new ArrowGrid(); <ArrowGrid /> 现在我遇到了一个问题,因为new ArrowGrid()会给我一个错误,说没有无参数的默认构造函数,所以我想到了这样做: public class
Microsoft.Extensions.DependencyInjection
Version5.0.1NuGet软件包,我正在创建一个名为ArrowGrid
的类,该类创建一些图形元素
我想用C#和可能的XAML调用这样的类:
var arrowGrid = new ArrowGrid();
<ArrowGrid />
现在我遇到了一个问题,因为new ArrowGrid()
会给我一个错误,说没有无参数的默认构造函数,所以我想到了这样做:
public class ArrowGrid : BaseGrid
{
private readonly IGraphicsService _graphicsService;
public ArrowGrid()
{
_graphicsService = Startup.ServiceProvider.GetRequiredService<GraphicsService>();
var fr = _graphicsService.GetFrameWithArrow();
Children.Add(fr, 3, 0);
}
}
我认为有以下建议:
var abc = Startup.ServiceProvider.GetRequiredService<ArrowGrid>();
abc.Text1 = "Talk to us";
abc.TapCommandParam = "Home/FBPage";
abc.IconSource = Const.IconSource.CardOptions;
var abc=Startup.ServiceProvider.GetRequiredService();
abc.Text1=“与我们交谈”;
abc.tapcomandparam=“主页/FBPage”;
abc.IconSource=Const.IconSource.cardpoptions;
Startup.ServiceProvider.GetRequiredService()对我来说很好,但有更好的方法。DI容器允许您懒惰,不必自己使用new
,也不必强制使用DI容器创建任何内容
考虑这个例子。希望您编写代码的类在servicecolection
中注册
公共类MyTestClass
{
公共MyTestClass()
{
var abc=Startup.ServiceProvider.GetRequiredService();
abc.Text1=“与我们交谈”;
abc.tapcomandparam=“主页/FBPage”;
abc.IconSource=Const.IconSource.cardpoptions;
}
}
可以很容易地用相同的DI版本替换
公共类MyTestClass
{
公共MyTestClass(箭头网格abc)
{
abc.Text1=“与我们交谈”;
abc.tapcomandparam=“主页/FBPage”;
abc.IconSource=Const.IconSource.cardpoptions;
}
}
这就是注册类的应用程序根目录的组合意义。请让DI Container为您解析实例,而不是执行
new
。谢谢您的建议。根据你的建议,我在问题上加了几句话。你能证实你认为我应该这样做吗。我想对我来说唯一的问题是,如果我这样做,那么我就不能再使用XAML来实例化该对象,因为该对象必须使用DI创建。直接使用ServiceProvider
是一种反模式。现在,您还将MyTestClass
与Startup
紧密耦合。这两者都违背了DI的目的。如果需要依赖项,请从外部请求并传入。否则,请重新考虑您的设计谢谢您出色的回答。我还有一个小问题,如果我的一个文件中需要两个箭头网格,该怎么办。例如,var arrowGrid1=new ArrowGrid();var arrowGrid2=新的ArrowGrid();你对我如何做到这一点有什么建议吗?@RichardApublicmytestclass(ArrowGrid abc,ArrowGrid def)
?:)@aepot抱歉,我想对OP发表评论
var abc = new ArrowGrid
{
Text1 = "Talk to us",
TapCommandParam = "Home/FBPage",
IconSource = Const.IconSource.CardOptions,
};
var abc = Startup.ServiceProvider.GetRequiredService<ArrowGrid>();
abc.Text1 = "Talk to us";
abc.TapCommandParam = "Home/FBPage";
abc.IconSource = Const.IconSource.CardOptions;