小编Ste*_*ven的帖子

我怎样才能使这个代码更加优化

我该如何优化这段代码?我不喜欢有案例陈述,有没有办法可以改进这段代码?

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 c# asp.net

7
推荐指数
3
解决办法
560
查看次数

如何使用.Net IO类创建可测试代码?

我想创建单元可测试的代码来模拟对.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

7
推荐指数
1
解决办法
961
查看次数

通用列表上的is-operator

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不起作用.有另一种方式吗?

.net c# generics inheritance list

7
推荐指数
1
解决办法
724
查看次数

使用SimpleInjector注册FluentValidation的正确方法是什么?

我可以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

7
推荐指数
1
解决办法
6888
查看次数

单位测试对象,其生命周期范围由IoC容器处理

我正在使用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 …

c# unit-testing dependency-injection simple-injector membus

7
推荐指数
2
解决办法
1719
查看次数

为什么我不能在通用IEnumerable对象上调用ToArray?

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参考列出了这种方法.这有什么不对?

c# arrays

7
推荐指数
2
解决办法
5638
查看次数

装饰ASP.NET Web API IHttpController

我试图总结的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# dependency-injection decorator asp.net-web-api

7
推荐指数
1
解决办法
4367
查看次数

Unity如何与C#类一起使用

通过研究纯C#,我发现Unity中的脚本(使用C#)有点不直观.

例如,似乎人们(初学者?)在Unity中使用脚本的最常见方式是创建"单一用途"类型脚本并将其附加到实际游戏对象(通过单击并将其拖动到脚本组件).以这种方式,似乎很少用于继承.或许我倒退了.我应该在附加到游戏对象之外创建类/继承,然后只将脚本附加到引用那些外部类的游戏对象吗?我相信你们中的一些人可能只会说"做你想做的事!" 或"做什么有效",但我不想从糟糕的编码方法开始,只是为了最后重构它.

我很困惑的另一件事是Unity中的类实例.无论出于何种原因,似乎我可以使用像Animator这样的内置类而无需实例化它[我几乎从未见过一个=新的Class(); ]然而这些类不是静态的.这是如何运作的?如果我构建自己的游戏对象引用的类,我是否必须创建与它们一起工作的实例,或者这一切都是由引擎在引擎盖下完成的吗?

所有这些脚本中的游戏对象(编辑器中的实际项目)在哪里?是否有为每个游戏对象制作的类?而且,如果是这样,我如何找到它并偷看它发生了什么?

c# unity-game-engine

7
推荐指数
1
解决办法
1720
查看次数

.NET Core依赖注入 - >获取接口的所有实现

我有一个名为IRule的接口和多个实现此接口的类.我想使用.NET Core依赖注入Container来加载IRule的所有实现,因此所有实现的规则.

不幸的是我无法做到这一点.我知道我可以注入一个IEnumerable<IRule>控制器的ctor,但我不知道如何在Startup.cs中注册这个设置

.net dependency-injection asp.net-core

7
推荐指数
3
解决办法
4235
查看次数

简单的注射器诊断警告一次性瞬态

我正在尝试配置简单的注入器工作,但我似乎无法通过这个.我按照说明如何在此链接中修复此问题,但它不起作用.这是错误消息:

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# dependency-injection simple-injector

7
推荐指数
1
解决办法
4923
查看次数