您好我正在使用Simple Injector DI库并且已经关注了一些关于围绕命令模式设计的架构模型的非常有趣的材料:
容器将管理生命周期UnitOfWork,我使用命令来执行数据库的特定功能.
我的问题是,如果我有一个命令,例如一个AddNewCustomerCommand,它反过来执行另一个服务的另一个调用(即发送文本消息),从设计的角度来看这是可接受的还是应该在更高的层次上完成,如果是的话最好这样做?
示例代码如下:
public class AddNewBusinessUnitHandler
: ICommandHandler<AddBusinessUnitCommand>
{
private IUnitOfWork uow;
private ICommandHandler<OtherServiceCommand> otherHandler;
AddNewBusinessUnitHandler(IUnitOfWork uow,
ICommandHandler<OtherServiceCommand> otherHandler)
{
this.uow = uow;
this.otherHandler = otherHandler;
}
public void Handle(AddBusinessUnitCommand command)
{
var businessUnit = new BusinessUnit()
{
Name = command.BusinessUnitName,
Address = command.BusinessUnitAddress
};
var otherCommand = new OtherServiceCommand()
{
welcomePostTo = command.BusinessUnitName
};
uow.BusinessUnitRepository.Add(businessUnit);
this.otherHandler.Handle(otherCommand);
}
}
Run Code Online (Sandbox Code Playgroud) 我有多个服务,每个服务都UnitOfWork使用Simple Injector IoC容器注入构造函数.
目前我可以看到每个UnitOfWork实例都是一个单独的对象,这很糟糕,因为我使用的是Entity Framework,并且需要在所有工作单元中使用相同的上下文引用.
如何确保UnitOfWork每个解析请求将相同的实例注入到所有服务中?UnitOfWor命令完成后,我将由外部命令处理程序装饰器保存.
请注意,这是一个公共库,将用于MVC和Windows Forms,如果可能的话,为两个平台提供通用解决方案会很不错.
代码如下:
// snippet of code that registers types
void RegisterTypes()
{
// register general unit of work class for use by majority of service layers
container.Register<IUnitOfWork, UnitOfWork>();
// provide a factory for singleton classes to create their own units of work
// at will
container.RegisterSingle<IUnitOfWorkFactory, UnitOfWorkFactory>();
// register logger
container.RegisterSingle<ILogger, NLogForUnitOfWork>();
// register all generic command handlers
container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>),
AppDomain.CurrentDomain.GetAssemblies());
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(TransactionCommandHandlerDecorator<>));
// register …Run Code Online (Sandbox Code Playgroud) .net c# dependency-injection entity-framework-4 simple-injector
我正在使用Simple Injector,但也许我需要的是更多的概念性答案.
这是交易,假设我有一个界面与我的应用程序设置:
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
Run Code Online (Sandbox Code Playgroud)
然后,通常会有一个实现IApplicationSettings的类,从指定的源获取每个字段,例如:
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
然而!假设我想EnableLogging从app.config,CopyLocal数据库和ServerName另一个获取当前计算机名称的实现中获取.我希望能够混合匹配我的应用程序配置,而无需创建9个实现,每个组合一个.
我假设我无法传递任何参数,因为接口由注入器(容器)解析.
我最初想到了这个:
public interface IApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
where TEnableLogging : IGetValue<bool>
where TCopyLocal : IGetValue<bool>
where TServerName : IGetValue<string>
{ …Run Code Online (Sandbox Code Playgroud) 我是.NET Core的新手,如果这是一个新手问题,我很抱歉.我使用VS 2017在.NET Core 2中创建了一个Web API项目.
对我来说,我有appsettings.json一些连接设置的文件.
在阅读了IOptions<T>微软教程后,我正在做类似以下的事情:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<MyOptions>(Configuration);
// I want to access MyOptions object here to configure other services?how do i do that?
service.AddHangfire( // Get MyOptions.HangfireConenctionString etc.)
}
Run Code Online (Sandbox Code Playgroud)
如何访问创建的MYOptions对象ConfigureServices以及是否需要在Configure(IApplicationBuilder app,..)方法中访问它?
我只IOptions<T>在教程中看到了控制器中的注入示例.
我在尝试使用企业库验证应用程序块时遇到以下异常:
创建用于验证的配置节处理程序时出错:无法加载文件或程序集"Microsoft.Practices.EnterpriseLibrary.Validation,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(来自HRESULT的异常:0x80131040)(C:\ Documents and Settings\My Documents\Visual Studio 2008\Projects\Testers\TestProject\web.config第12行)
我知道异常试图告诉我什么,但我无法弄清楚如何解决它.我只安装了一个版本的企业库,这就是它(4.1.0.0),所以我看不出它是如何找到错误的版本,所以我想它是一个依赖问题.我已经从企业库4.1中包含了"Common","Validation"和"ObjectBuilder2"DLL作为项目中的参考,所以我不确定我还缺少什么.文档肯定似乎表明这就是我所需要的.
有没有办法找出依赖问题是什么?
如果有帮助,我尝试使用企业库配置工具创建验证应用程序块规则集,以验证实体框架实体中的数据.我在Visual Studio 2008中使用ASP.NET MVC.
感谢您提供的任何帮助/指导,
克里斯
Business Objects的验证是一个常见问题,但有一些解决方案可以解决这个问题.
其中一个解决方案是使用独立的NHibernate.Validator框架,这是一个基于属性的验证框架.
但我正面临着概念上的担忧.像NH.Validator这样的属性验证器很棒,但只有在Session中的save-update-delete时才会执行验证.
所以我想知道业务对象是否不应该自我验证以保持自己的完整性和一致性?
我该如何优化这段代码?我不喜欢有案例陈述,有没有办法可以改进这段代码?
protected void ddlFilterResultBy_SelectedIndexChanged(object sender, EventArgs e)
{
string selVal = ddlFilterResultBy.SelectedValue.ToString().ToLower();
switch (selVal)
{
case "date":
pnlDate.Visible = true;
pnlSubject.Visible = false;
pnlofficer.Visible = false;
pnlCIA.Visible = false;
pnlMedia.Visible = false;
pnlStatus.Visible = false;
break;
case "subject":
pnlDate.Visible = false;
pnlSubject.Visible = true;
pnlofficer.Visible = false;
pnlCIA.Visible = false;
pnlMedia.Visible = false;
pnlStatus.Visible = false;
break;
case "officer":
pnlDate.Visible = false;
pnlSubject.Visible = false;
pnlofficer.Visible = true;
pnlCIA.Visible = false;
pnlMedia.Visible = false;
pnlStatus.Visible = false;
break;
case "status": …Run Code Online (Sandbox Code Playgroud) 我可以AbstractValidators使用a 注册FluentValidation FluentValidatorFactory.但是,它感觉不对,因为并非所有IoC容器注册都在bootstrap/composition root期间发生.相反,流利的验证器由一个单独的工厂注册:
所述组合物根:
public class SimpleDependencyInjector : IServiceProvider
{
public readonly Container Container;
public SimpleDependencyInjector()
{
Container = Bootstrap();
}
internal Container Bootstrap()
{
var container = new Container();
container.Register< // ...register all non-fluent-validator types, then
container.Verify();
return container;
}
public object GetService(Type serviceType)
{
return ((IServiceProvider)Container).GetService(serviceType);
}
}
Run Code Online (Sandbox Code Playgroud)
一个抽象的流利验证工厂,仅依赖于IServiceProvider
public abstract class FluentValidatorFactory : ValidatorFactoryBase
{
private IServiceProvider Injector { get; set; }
protected FluentValidatorFactory(IServiceProvider injector) …Run Code Online (Sandbox Code Playgroud) dependency-injection fluentvalidation fluentvalidation-2.0 open-generics simple-injector
我试图总结的Web API控制器(IHttpController带装饰的实现),但我这样做的时候,网页API抛出一个异常,因为在某种程度上它期待的实际执行.
将装饰器应用于控制器是我成功应用于MVC控制器的一个技巧,我显然希望在Web API中也这样做.
我创建了一个IHttpControllerActivator允许解析修饰IHttpController实现的自定义.这是一个剥离的实现:
public class CrossCuttingConcernHttpControllerActivator : IHttpControllerActivator {
private readonly Container container;
public CrossCuttingConcernHttpControllerActivator(Container container) {
this.container = container;
}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController)this.container.GetInstance(controllerType);
// Wrap the instance in one or multiple decorators. Note that in reality, the
// decorator is applied by the container, but that doesn't really matter here.
return new MyHttpControllerDecorator(controller);
}
}
Run Code Online (Sandbox Code Playgroud)
我的装饰师看起来像这样:
public class MyHttpControllerDecorator : IHttpController …Run Code Online (Sandbox Code Playgroud) 通过研究纯C#,我发现Unity中的脚本(使用C#)有点不直观.
例如,似乎人们(初学者?)在Unity中使用脚本的最常见方式是创建"单一用途"类型脚本并将其附加到实际游戏对象(通过单击并将其拖动到脚本组件).以这种方式,似乎很少用于继承.或许我倒退了.我应该在附加到游戏对象之外创建类/继承,然后只将脚本附加到引用那些外部类的游戏对象吗?我相信你们中的一些人可能只会说"做你想做的事!" 或"做什么有效",但我不想从糟糕的编码方法开始,只是为了最后重构它.
我很困惑的另一件事是Unity中的类实例.无论出于何种原因,似乎我可以使用像Animator这样的内置类而无需实例化它[我几乎从未见过一个=新的Class(); ]然而这些类不是静态的.这是如何运作的?如果我构建自己的游戏对象引用的类,我是否必须创建与它们一起工作的实例,或者这一切都是由引擎在引擎盖下完成的吗?
所有这些脚本中的游戏对象(编辑器中的实际项目)在哪里?是否有为每个游戏对象制作的类?而且,如果是这样,我如何找到它并偷看它发生了什么?
c# ×9
.net ×4
architecture ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
decorator ×1
unit-of-work ×1
validation ×1