我该如何优化这段代码?我不喜欢有案例陈述,有没有办法可以改进这段代码?
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) 我想创建单元可测试的代码来模拟对.Net System.IO类的调用,所以我可以真正进行单元测试,而不是依赖于文件系统.我正在使用SystemWrapper类来包装BCL类.
我试图找一个简单的例子来查看文件是否存在.
我遇到的问题是在类中注入依赖项不起作用,因为实例化依赖项(通过StructureMap)需要知道要传递的构造函数参数,这在当时是不可用的,也没有默认构造函数.
示例代码:
// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);
// using service locator (anti-pattern?!) since it can't be
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance<IFileInfoWrap>(
new ExplicitArguments(new Dictionary<string, object>
{
{"fileName", filename}
}));
Console.WriteLine("File exists? {0}", fileInfoWrap.Exists);
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是没有注入依赖项,ObjectFactory不应该在这里(但我没有看到其他创建方法).ExplicitArguments使它变得混乱,参数名称是一个魔术字符串.
让我开始工作StructureMap配置类需要知道我要使用哪个构造函数(我刚开始使用StructureMap所以这可能不是正确的设置方式):
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.AssembliesFromPath(".");
scan.RegisterConcreteTypesAgainstTheFirstInterface();
scan.WithDefaultConventions();
});
// use the correct constructor (string instead of FileInfo)
x.SelectConstructor(() => new FileInfoWrap(null as string)); …Run Code Online (Sandbox Code Playgroud) c# tdd dependency-injection inversion-of-control base-class-library
interface IVehicle
{
void DoSth();
}
class VW : IVehicle
{
public virtual void DoSth() { ... }
}
class Golf : VW { }
class Lupo : VW
{
public override void DoSth()
{
base.DoSth();
...
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码我有:
List<VW> myCars = new List<VW>();
myCars.Add(new Golf());
myCars.Add(new Lupo());
Run Code Online (Sandbox Code Playgroud)
现在我想评估我是否有车辆清单.就像是:
if(myCars is List<IVehicle>)
{
foreach(IVehicle v in myCars)
v.DoSth();
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?通用列表中的is-operator不起作用.有另一种方式吗?
我可以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
我正在使用Microsoft Unit Test并具有以下内容:
public class AccountCommandHandlers :
Handler<CreateAccountCommand>,
Handler<CloseAccountCommand>
{
public bool CreateAccountCommandWasCalled = false;
public bool CloseAccountCommandWasCalled = false;
public void Handle(CreateAccountCommand command)
{
CreateAccountCommandWasCalled = true;
}
public void Handle(CloseAccountCommand command)
{
CloseAccountCommandWasCalled = true;
}
}
[TestMethod]
public void CanRaiseInternalHandlers()
{
var iocContainer = SimpleInjectorWiringForMembus.Instance;
iocContainer.Bootstrap(
AppDomain.CurrentDomain.GetAssemblies());
var membus = MembusWiring.Instance;
membus.Bootstrap();
membus.Bus.Publish(new CreateAccountCommand() { Id = 100 });
membus.Bus.Publish(new CloseAccountCommand() { Id = 100 });
}
Run Code Online (Sandbox Code Playgroud)
我正在使用IoC容器(Simple Injector)来处理对象的生命周期范围.Membus将命令连接到命令处理程序,并通过IoC容器解析.
上面的代码运行并运行,命令处理程序将其局部变量设置为true.
但是,由于Simple Injector处理生命周期范围,我无法向Simple Injector请求一个AccountCommandHandler对象,因为它会返回一个CreateAccountCommandWasCalled设置为false …
public static T[] ToArray<T>(IEnumerable<T> e) {
return e.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
我得到以下编译器错误:
错误1
System.Collections.Generic.IEnumerable<T>不包含定义,ToArray并且没有 可以找到ToArray接受类型的第一个参数的扩展方法System.Collections.Generic.IEnumerable<T>(您是否缺少using指令或程序集引用?
但是MSDN参考列出了这种方法.这有什么不对?
我试图总结的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(); ]然而这些类不是静态的.这是如何运作的?如果我构建自己的游戏对象引用的类,我是否必须创建与它们一起工作的实例,或者这一切都是由引擎在引擎盖下完成的吗?
所有这些脚本中的游戏对象(编辑器中的实际项目)在哪里?是否有为每个游戏对象制作的类?而且,如果是这样,我如何找到它并偷看它发生了什么?
我有一个名为IRule的接口和多个实现此接口的类.我想使用.NET Core依赖注入Container来加载IRule的所有实现,因此所有实现的规则.
不幸的是我无法做到这一点.我知道我可以注入一个IEnumerable<IRule>控制器的ctor,但我不知道如何在Startup.cs中注册这个设置
我正在尝试配置简单的注入器工作,但我似乎无法通过这个.我按照说明如何在此链接中修复此问题,但它不起作用.这是错误消息:
NotificationEntities注册为transient,但实现了IDisposable.
这是SimpleInjectorInitializer.cs的代码
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IEmailTemplateRepository, EmailTemplateRepository>();
}
Run Code Online (Sandbox Code Playgroud)
NotificationEntities是从EF生成的,所以它应该已经实现了,对吗?
c# ×8
.net ×3
arrays ×1
asp.net ×1
asp.net-core ×1
decorator ×1
generics ×1
inheritance ×1
list ×1
membus ×1
tdd ×1
unit-testing ×1