我正在使用存储库和服务层设计模式构建 ASP.NET MVC 5 应用程序。我已经使用 unity 将我的服务注入到我的控制器中。
这工作得很好,直到现在我还不需要考虑实例化任何需要在控制器外部注入接口的对象。但是,在配置应用程序启动以在数据库中设置一些用户时,我需要这样做。
为此,我想使用我UsersService
构建的。我想到,随着应用程序的增长,肯定会在其他情况下我想做同样的事情,例如从另一个服务中调用一个服务。
我发现我可以实例化一个 Unity 容器并调用它的解析来获取我的新服务实例:
IProductService productService = container.Resolve<IProductService>();
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说有点难闻,让容器泄漏到我的应用程序中似乎是一种反模式。那么有没有更好的方法来做到这一点呢?
asp.net-mvc dependency-injection unity-container asp.net-mvc-5
我尝试在Node.js v8.9.4中计算这个表达式:
`${ xxx 123 }`
Run Code Online (Sandbox Code Playgroud)
它抛出错误
模板表达式中缺少 }
我知道上面的表达式应该会导致错误,因为里面的内容${}
不是有效的 JavaScript。但为什么错误消息声称}
缺少 a 呢?我可以清楚地看到一个开口
{
和一个关闭}
。为什么说}
缺少a?
我想使用Gulp和/或NPM将2个目录(helpers/
和dialogs/
)中的每个文件名放入一个没有文件扩展名的数组中.请注意,数组将预先填充值 - 我需要将文件名附加到此数组.
换句话说,我的目录结构是这样的:
helpers/
a.js
b.js
c.js
dialogs/
x.js
y.js
z.js
Run Code Online (Sandbox Code Playgroud)
我有这个:
var modules = ['main-module'];
Run Code Online (Sandbox Code Playgroud)
我需要根据目录填充我的数组:
var modules = ['main-module', 'a', 'b', 'c', 'x', 'y', 'z'];
Run Code Online (Sandbox Code Playgroud)
我怎么做?
我已经尝试过使用fs模块fs.readdirSync和gulp -rename,但如果可能的话,在单个流操作中完成此任务会很不错.
将每个目录放入其自己的数组以进行其他操作也很有用 - 换句话说,根据目录输出组合数组和2个单独的数组(总共3个数组).
var modules = ['main-module', 'a', 'b', 'c', 'x', 'y', 'z'];
var helpers = ['a', 'b', 'c'];
var dialogs = ['x', 'y', 'z'];
Run Code Online (Sandbox Code Playgroud) 我正在使用CastleWindsor作为我的依赖注入框架,当你在Controller中时它们都运行良好,因为我们可以使用controllerfactory构造函数注入.
但是有一些特定的情况,依赖注入(构造函数注入)将不起作用.例如:我希望能够在我的视图中的一些实用程序类或扩展方法(例如HtmlHelper)中使用IOC来解析依赖关系.我知道有些人不同意这一点,而是保持观点愚蠢,但让我们继续讨论.
所以这基本上让我有一个选项,那就是使用...服务定位器.所以我知道服务定位器被大多数人认为是反模式,我明白为什么..但是如果不能使用依赖注入,如何解决与IOC的依赖关系?对于我所知道的一切,使用IOC的服务定位器比没有任何东西更好.我想避免服务定位器模式,但我似乎不明白在某些特定情况下如何避免它.
接下来的问题是..所以即使你喜欢/不喜欢服务定位器.哪个是使用CastleWindsor实现此功能的最佳选择?
所以我猜选项是:
将容器公开为全局对象(或通过包装容器的其他全局对象),您可以从代码中的任何位置检索该容器.然后,您可以在容器上调用resolve和release方法.我不喜欢的一点是,我们必须明确地为瞬态生活方式对象调用release.如果没有经验的开发人员不这样做,你最终会发生内存泄漏.
我还发现:https://www.nuget.org/packages/CommonServiceLocator.WindsorAdapter,它有很多下载..(与选项1相同,但更通用,包装容器,以便您可以轻松交换DI框架)我查看了代码,发现适配器只有解析对象的方法.所以我有点想知道为什么没有发布方法..这是否意味着这个包有瞬态生活方式对象的内存泄漏问题?
希望有人能就这些问题给我一些建议!
asp.net-mvc dependency-injection castle-windsor castle service-locator
我为我的 asp net mvc 电子商务开发面包屑。我有一个用于我的类别的控制器。它看起来像这样:
public class CategoryController : AppController
{
public ActionResult Index(string cat1, string cat2, string cat3, int? page)
{
... some code
// build breadcrumbs from parent cats
int indexer = 0;
foreach(var item in parCategories) //parCategories - list of parent categories
{
string currCatIndex = new StringBuilder().AppendFormat("category{0}", indexer + 1).ToString(); //+2 cause arr index begins from 0
var currNode = SiteMaps.Current.FindSiteMapNodeFromKey(currCatIndex);
currNode.Title= parCategories.ElementAt(indexer).Name;
indexer++;
}
string finalCatIndex = new StringBuilder().AppendFormat("category{0}", CategoryDepth + 1).ToString();
var node = …
Run Code Online (Sandbox Code Playgroud) 发布后我得到模型中的列表为空我的模型有一个属性,它是 vwLog 的列表。
public class CreateLogViewModel
{
public List<vwLog> LogData;
}
Run Code Online (Sandbox Code Playgroud)
鉴于我使用该模型并使用 foreach 循环来分配文本控件中的值
@model CreateLogViewModel
@using (Html.BeginForm("CreateLog", "Log", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
foreach (var item in Model.LogData)
{
<table>
<tr>
<td>
@Html.HiddenFor(modelItem => item.LogID)
@Html.TextBoxFor(modelItem => item.AgencyBillingCode)
</td>
<td>
@Html.TextBoxFor(modelItem => item.LicenseNumber)
</td>
</tr>
</table>
}
<div class="col-xs-12" align="center">
<input class="btn btn-default" type="submit" name="Submit" value="Save" id="Submit">
</div>
}
Run Code Online (Sandbox Code Playgroud)
我的控制器是
在 Get 方法中,我正在分配 LogData 对象中的值,该对象是 vwlog 的集合。
public ActionResult CreateLog(CreateLogViewModel model)
{
model.LogData …
Run Code Online (Sandbox Code Playgroud) 我收到此错误:
An exception of type 'System.NullReferenceException' occurred in PubStuff.Intern.Web.Internal.dll but was not handled in user code
Additional information: Object reference not set to an instance of an object
public class InternController : BaseController
{
IInternService _internService;
public InternController() { }
public InternController(IInternService internService)
{
_internService = internService;
}
// GET: Intern
public ActionResult Index()
{
object responseObject = null;
responseObject = _internService.GetAllSkills();
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
responseObject = _internService.GetAllSkills();
函数,那么这一行就会抛出错误._internService为null
我该如何解决? 有什么问题?
更新 我最终遇到了StructureMap的问题,无论我是否添加了IInternUnitOfWork …
我有2个不同的第三方程序集,它们为业务服务提供相同的API并使用相同的类名(~40个类/类型/扩展名)但位于不同的程序集中:
Company.Assemply.V1
Company.Assemply.V2
Run Code Online (Sandbox Code Playgroud)
我引用了项目中的两个程序集.
这些程序集没有通用接口,第三方也无法提供通用接口
因此,c#编译器将两个程序集中的每个类型视为不同的类型.
我想Myservice
为每个程序集实现一个类来支持V1/V2版本.
我使用以下代码来实现 Myservice.V1.Myclass
//#define V1
#if V1
using Company.Assemply.V1;
#else
using Company.Assemply.V2;
#endif
#if V1
namespace Myservice.V1
#else
namespace Myservice.V2
#endif
{
//my implementation that use all classes /types in any v1/v2 assembly
class MyClass {.... }
}
Run Code Online (Sandbox Code Playgroud)
然后我将相同的代码复制并粘贴到其他c#文件 MyClassV2.cs
(大约400行)中,以获取 Myservice.V2.Myclass
和取消注释编译器标志#define V1
我不能使用泛型
MyClass <T> where T:??
Run Code Online (Sandbox Code Playgroud)
因为T没有通用接口
这两个班级工作正常.
问题是在维护v1时,我必须将代码复制/粘贴到另一个文件中,MyClassV2.cs
并取消注释编译器标志#define V1
以支持V2.
是否有更好的方法/合适的设计模式/重构技术可以解决这样的问题.我想使用/维护一个代码库,避免复制/粘贴其他类版本.
给我一个重构上面代码的例子.
目前正在为我的课程从事Web服务项目,并已决定使用.NET Core和DynamodDB创建Web API。
我只是很好奇注入的最佳方法DynamoDBContext
是什么?
我目前正在这样做:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
services.AddAWSService<IAmazonDynamoDB>();
}
Run Code Online (Sandbox Code Playgroud)
我从DynamoDB文档中获得了这段代码。我将一个实例添加IAmazonDynamoDB
到项目中。
DynamoDBContext context;
public ValuesController(IAmazonDynamoDB context)
{
this.context = new DynamoDBContext(context);
}
Run Code Online (Sandbox Code Playgroud)
然后,在控制器中,注入IAmazonDynamoDB
实例,并使用该实例创建的实例DynamoDBContext
。
有没有办法在该ConfigureServices
方法中创建上下文实例并将其添加到那里的项目中,或者我目前正在做的方式还可以吗?
我有一个简单的抽象工厂,返回一个简单的类型.基本上,它只是用数据填充类型并返回它,类似于DTO.
public interface IPagingInstructionFactory
{
IPagingInstruction Create(int skip, int take, IProvider provider);
}
public interface IPagingInstruction
{
int Skip { get; }
int Take { get; }
IProvider Provider { get; }
}
Run Code Online (Sandbox Code Playgroud)
我现在想要创建一个模拟工厂,它基本上与真实工厂做同样的事情 - 它从Create()方法传递参数并从IPagingInstruction实例的属性返回它们.
这是一个有效的例子:
var pagingInstructionFactory = new Mock<IPagingInstructionFactory>();
pagingInstructionFactory
.Setup(x => x.Create(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<IProvider>()))
.Returns((int skip, int take, IProvider provider) =>
new FakePagingInstruction(skip, take, provider));
public class FakePagingInstruction
: IPagingInstruction
{
public FakePagingInstruction(
int skip,
int take,
IProvider provider
)
{
if (provider == null)
throw …
Run Code Online (Sandbox Code Playgroud) 好的,我之前的问题/设置有太多的变量,所以我将其分解为简单的骨骼组件。
鉴于以下使用 StructureMap3 的代码...
//IoC setup
For<HttpContextBase>().UseSpecial(x => x.ConstructedBy(y => HttpContext.Current != null ? new HttpContextWrapper(HttpContext.Current) : null ));
For<ICurrentUser>().Use<CurrentUser>();
//Classes used
public class CurrentUser : ICurrentUser
{
public CurrentUser(HttpContextBase httpContext)
{
if (httpContext == null) return;
if (httpContext.User == null) return;
var user = httpContext.User;
if (!user.Identity.IsAuthenticated) return;
UserId = httpContext.User.GetIdentityId().GetValueOrDefault();
UserName = httpContext.User.Identity.Name;
}
public Guid UserId { get; set; }
public string UserName { get; set; }
}
public static class ClaimsExtensionMethods
public static Guid? GetIdentityId(this IPrincipal …
Run Code Online (Sandbox Code Playgroud) c# structuremap asp.net-mvc dependency-injection structuremap3
我只是学习使用Ninject依赖注入,并使用System.IO.Abstractions来抽象文件系统.我试图使用Ninject绑定DirectoryInfoBase
到DirectoryInfo
如此:
IKernel ninject = new StandardKernel();
ninject.Bind<DirectoryInfoBase>().To<DirectoryInfo>();
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
错误1类型'System.IO.DirectoryInfo'不能用作泛型类型或方法'Ninject.Syntax.IBindingToSyntax.To()'中的类型参数'TImplementation'.没有从'System.IO.DirectoryInfo'到'System.IO.Abstractions.DirectoryInfoBase'的隐式引用转换.C:\ Users\Trevor\Dropbox\Code\PhotoOrganiser\PhotoOrganiser\Program.cs 13 13 PhotoOrganiserApp
我在这里错过了什么?我认为像这样的图书馆的目标是能够执行这些类型的任务吗?
c# ×7
asp.net-mvc ×6
.net ×2
structuremap ×2
.net-core ×1
asp.net ×1
castle ×1
ecmascript-6 ×1
generics ×1
gulp ×1
interface ×1
javascript ×1
moq ×1
ninject ×1
node.js ×1
npm ×1
nunit ×1
refactoring ×1
unit-testing ×1