我正在寻找一种可以使用指定的生活方式注册具体类型的方法,基本上如下所示。
public void SomeFunction( Type concrete, Lifestyle lifestyle ) =>
container.Register( concrete, lifestyle );
Run Code Online (Sandbox Code Playgroud) 只是想对ninject中Kernel.Resolve和Kernel.Get之间的区别做一些澄清.
Kernel.Get状态的描述
通过使用与指定约束匹配的第一个绑定来获取指定服务的实例
Kernel.Resolve状态的描述
解析指定请求的实例.在消费者迭代枚举之前,实际上并未解析实例.
您可以在哪些情况下使用其中任何一种?(现在我正在使用Get)
我在代码重构后收到来自 Ninject 的异常。因此我知道是什么导致了错误,但无法确定原因。代码编译文件,但我从 Ninject 收到运行时错误:
不能为空参数名:root
我正在尝试注入一个类的常量实例:
var subscriptionApiClientHelper = new SubscriptionApiClientHelper(AppSettings.Get<string>("AdminAPIUrl"),
AppSettings.Get<string>("APIV2Key"), Kernel.Get<ICache>());
kernel.Bind<SubscriptionApiClientHelper>().ToConstant(subscriptionApiClientHelper);
Run Code Online (Sandbox Code Playgroud)
Ninject 在第一行抛出异常。
我的类 SubscriptionApiClientHelper 继承自另一个类(在 Nuget 包中引用),因此:
public SubscriptionApiClientHelper(string baseUrl, string apiKey, ICache cache) : base(baseUrl, apiKey)
{
_cache = cache;
}
Run Code Online (Sandbox Code Playgroud)
其构造函数是这样的:
public SubscriptionApiClient(string baseUrl, string apiKey)
{
_baseUrl = baseUrl;
_apiKey = apiKey;
}
Run Code Online (Sandbox Code Playgroud)
这个基类中的几个方法被覆盖并实现了缓存,因此覆盖的原因是我不需要在基类的所有方法上实现缓存。我从同一个 Nuget 包中注入了一些其他类,但没有问题,但这些没有我怀疑导致问题的继承。注意我成功地注入并使用了我继承的基类(SubscriptionApiClient),它只是导致问题的辅助类。
这是完整的堆栈跟踪:
at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique)
at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
at AdminPortal.NinjectWebCommon.RegisterServices(IKernel kernel) …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET Core中使用WebAPI.
这有效:
services.AddScoped<IApiKeysService, APIKeysService>();
Run Code Online (Sandbox Code Playgroud)
现在接口返回泛型类型T这不是
services.AddScoped<IApiKeysService>();
Run Code Online (Sandbox Code Playgroud)
错误使用泛型类型blah需要1种类型的参数
或这个
services.AddScoped<IApiKeysService<T>>();
Run Code Online (Sandbox Code Playgroud)
我得到以下编译错误
无法找到类型或命名空间T.
我该如何注册Startup.cs?
注意:我不能使用具体类型,因为接口成员是具有泛型方法的基类.
我的应用程序使用实体框架。由于我希望DbContext在单个请求中重用my ,因此我将其注册为Lifestyle.Scoped,如下所示:
container.Register<MyDbContext>(Lifestyle.Scoped);
Run Code Online (Sandbox Code Playgroud)
其他类得到这个MyDbContext注入。例如,请参阅以下存储库:
应用程序库是:
public class ApplicationsRepository : IApplicationsRepository
{
private readonly MyDbContext _dbContext;
public ApplicationsRepository(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public void Save()
{
_dbContext.Save();
}
public Application GetByName(string appName)
{
var dbApplication = _dbContext.APPLICATIONS.FirstOrDefault(a => a.NAME == appName);
return ApplicationMapper.MapApplicationFromAPPLICATIONS(dbApplication);
}
}
Run Code Online (Sandbox Code Playgroud)
但是还有无数其他类依赖于MyDbContext. 其他类可能不MyDbContext直接依赖,但会注入一个依赖于MyDbContext.
我的问题是:我应该为这些课程使用什么样的生活方式管理以及如何实施?
查看有关如何使用数据库上下文池的示例,我发现它是设计用于ServiceCollection:
var serviceProvider = new ServiceCollection()
.AddDbContextPool<AdventureWorksContext>(options => { //options })
.BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud)
但是简单注入器呢?是否可以在Simple Injector容器中注册数据库池?
ps我的应用不是ASP.NET MVC,只是DAL
我有以下存储过程
ALTER PROCEDURE [dbo].Test
AS
BEGIN
CREATE TABLE ##table
(
ID1 int,
ID2 int
)
DECLARE @query varchar(MAX);
INSERT INTO ##table VALUES(1, 1);
SELECT * FROM ##table;
END
Run Code Online (Sandbox Code Playgroud)
我尝试从C#代码中使用它.我使用LINQ to SQL作为O/RM.当我将过程添加到DataBaseContext时,它说它无法弄清楚此过程的返回值.如何修改存储过程以便我可以将它与LINQ to SQL一起使用.
注意:我需要有全局模板表!
我试图将我的应用程序从服务模式重写为命令和查询模式(在我转移到CQRS之前).目前我被困在这个博客上.
它显示了他将工作单元提交从base命令转移到a中的位置PostCommitCommandHandlerDecorator,然后使用Simple Injector将它们绑定起来.作者还指出,并非所有命令都需要使用工作单元,这在我的情况下是正确的,因为不是每个命令都与数据库对话,而是有些发送电子邮件等.
如何构建我的命令和绑定,使得只有那些需要包含在工作单元提交中的命令才会被IoC容器绑定?
如何启用允许我在开发过程中旋转场景的场景(场景Gizmo),这是位于场景右上角的场景.当我点击它来改变视图的位置但是它一直工作到现在为止它突然消失了.有人可以告诉我解决这个问题吗?
谢谢
林做一个2D游戏在Unity 2D(4.3),我需要销毁时,这些组合屋去关闭屏幕实例化的组合屋.我已经编写了一些代码来生成Objects,但是当我们离开屏幕时我想要删除那些预制件.这是我到目前为止编写的代码.
要生成预制件(C#):
void Update () {
float y = Random.Range(-4.53f, 2.207f);
if(x < 2000) {
Instantiate(obstacle, new Vector3(y, x * 6.0f, 0),Quaternion.identity);
x++;
}
//Debug.Log(x);
}
Run Code Online (Sandbox Code Playgroud)
要销毁预制件(C#):
/*************************************************************************************************
* GET INSTANTIATED OBSTACLE
* AND DESTROY IT ON EXIT
* TO SAVE MEMORY
**************************************************************************************************/
GameObject clone = (GameObject)Instantiate (obstacle);
/*if(clone.transform.position.y == -11)
{
Destroy(clone);
Debug.Log("Destroy");
}*/
Vector2 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
if (screenPosition.y > Screen.height || screenPosition.y < 0)
{
Destroy(gameObject);
Debug.Log("Destroy");
}
Run Code Online (Sandbox Code Playgroud)
但是,销毁对象的代码不起作用,但也没有出现错误.在预制件离开屏幕后输出"Destroy",所以我知道破坏它们的代码有问题.
谢谢
c# ×7
ninject ×2
.net ×1
.net-core ×1
android ×1
asp.net-core ×1
asp.net-mvc ×1
cqrs ×1
dbcontext ×1
destroy ×1
ef-core-2.1 ×1
generics ×1
linq-to-sql ×1