小编Ben*_*ter的帖子

传递匿名类型作为方法参数

在我的插件架构中,我目前正在将插件名称(字符串),方法名称(字符串)和参数(对象数组)传递给我的插件服务,以执行指定的方法并返回结果(类型为T).

插件服务的execute方法如下所示:

public TResult Execute<TResult>(string pluginName, string operation, params object[] input) {
    MethodInfo method = null;
    TResult result = default(TResult);

    var plugin = _plugins.Enabled().FirstOrDefault(x => x.GetType().Name.Equals(pluginName,  StringComparison.InvariantCultureIgnoreCase));

    if (plugin != null) {
        method = plugin.GetType().GetMethods().FirstOrDefault(x => x.Name == operation);
        if (method != null) {
            result = (TResult)method.Invoke(plugin, input);
        }
    }
    return result;
  }
Run Code Online (Sandbox Code Playgroud)

示例用法:

var url = AppHelper.PluginService.Execute<string>(
    "ImagePlugin",
    "GetImageUrl",
    new object[] { image, size });
Run Code Online (Sandbox Code Playgroud)

我宁愿做的是传递匿名类型(因为我认为这更具可读性)即

var url = AppHelper.PluginService.Execute<string>(
    "ImagePlugin",
    "GetImageUrl",
    new { image = image, targetSize = …
Run Code Online (Sandbox Code Playgroud)

c# reflection anonymous-types

22
推荐指数
4
解决办法
4万
查看次数

ASP.NET MVC和EF Code First Memory Usage

我有一个内置在ASP.NET MVC 3中的应用程序,它使用SQL CE进行存储,使用EF CTP 5进行数据访问.

我已将此站点部署到共享主机,但发现它始终被回收,因为它达到了他们(专用)应用程序池上设置的100mb限制.

在发布模式下运行时,该站点使用大约110mb RAM.

我尝试过使用SQL Server Express而不是CE,这没有什么区别.

唯一显着的区别是我完全删除了EF(使用假的回购).这使内存使用量降低了30mb-40mb.一个空白的MVC模板使用大约20mb所以我认为这不是太糟糕了?

"标准"ASP.NET MVC应用程序是否有任何基准?

了解其他EF CTP用户获得的内存利用率以及内存分析工具(最好是免费的)的一些建议会很好.

值得一提的是我如何处理EF ObjectContext的生命周期.我正在使用每个请求的会话并使用StructureMap实例化ObjectContext:

For<IDbContext>().HttpContextScoped().Use(ctx => new MyContext("MyConnStringName"));
Run Code Online (Sandbox Code Playgroud)

非常感谢Ben

asp.net-mvc performance entity-framework

17
推荐指数
1
解决办法
6397
查看次数

响应式iframe,最大宽度和高度

我有一个固定高度的容器,包含图像和iframe.为了使图像响应并防止垂直和水平溢出,我可以设置以下CSS:

img {
    max-width: 100%;
    max-height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

这可确保纵向图像不会垂直溢出,并且横向图像不会水平溢出.

对于iframe,我使用"填充比" 技术,将包装元素的填充设置为iframe的宽高比(例如,对于16:9视频,为56.25%):

.iframe-wrapper {
    position: relative;
    height: 0;
    padding-top: 56.25%;
    overflow: hidden;
}

.iframe-wrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

虽然这意味着iframe按视口宽度缩放,但如果我更改视口的高度,它将无法正常工作.基本上我喜欢iframe来模仿图像的工作方式.

css iframe responsive-design

16
推荐指数
3
解决办法
4万
查看次数

使用SqlConnection/System.Transactions进行Session-Per-Request

我刚刚开始使用Dapper进行一个项目,过去几年大多使用像NHibernate和EF这样的ORM.

通常在我们的Web应用程序中,我们按请求实现会话,在请求开始时开始事务并在结束时提交它.

我们应该在直接使用SqlConnection/System.Transactions时做类似的事情吗?

StackOverflow如何做到这一点?

根据@gbn和@Sam Safron的建议,我没有使用交易.在我的情况下,我只是在进行读取查询,因此似乎没有真正的要求使用事务(与我所知道的隐式事务相反).

我创建了一个轻量级的会话接口,以便每个请求都可以使用一个连接.这对我来说非常有益,因为对于Dapper我经常需要创建一些不同的查询来构建一个对象,而宁愿共享相同的连接.

确定每个请求的连接并处理它的工作是由我的IoC容器(StructureMap)完成的:

public interface ISession : IDisposable {
    IDbConnection Connection { get; }
}

public class DbSession : ISession {

    private static readonly object @lock = new object();
    private readonly ILogger logger;
    private readonly string connectionString;
    private IDbConnection cn;

    public DbSession(string connectionString, ILogger logger) {
        this.connectionString = connectionString;
        this.logger = logger;
    }

    public IDbConnection Connection { get { return GetConnection(); } }

    private IDbConnection GetConnection() {
        if (cn == null) {
            lock (@lock) …
Run Code Online (Sandbox Code Playgroud)

sql-server sqlconnection system.transactions dapper

15
推荐指数
1
解决办法
1962
查看次数

控制源文件的顺序

我正在使用Gulp和main-bower-files来捆绑我的bower依赖项.

我需要确保在AngularJS之前包含jQuery,但由于Angular bower包实际上并不依赖于jQuery,因此它包含在之后.

有没有办法将jQuery推到源列表的顶部或覆盖Angular的依赖,所以它需要jQuery?

我尝试使用gulp-order插件来执行此操作,但它会混淆其余文件的原始顺序:

gulp.task('bower', function () {

  var sources = gulp.src(mainBowerFiles(['**/*.js', '!**/*.min.js'])); // don't include min files

  return sources
    // force jquery to be first
    .pipe(plugins.order([
      'jquery.js',
      '*'
    ]))
    .pipe(plugins.sourcemaps.init())
      .pipe(plugins.concat('libs.min.js'))
      .pipe(plugins.uglify())
    .pipe(plugins.sourcemaps.write('./'))
    .pipe(gulp.dest(config.output))
    .pipe(plugins.notify({ message: 'Bower task complete' }));
});
Run Code Online (Sandbox Code Playgroud)

bower gulp

15
推荐指数
2
解决办法
3882
查看次数

自定义错误不适用于IISExpress

我有一个asp.net mvc应用程序,我正在尝试使用IISExpress进行自定义错误.

适用于Casini罚款:

<customErrors mode="On" defaultRedirect="/error">
  <error statusCode="404" redirect="/error/notfound"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)

当我之前将mvc站点部署到IIS(7.5)之后,我所要做的就是设置我的自定义错误:

<httpErrors errorMode="Detailed"/>
Run Code Online (Sandbox Code Playgroud)

我已经尝试在httpErrors部分中明确指定状态代码,但没有任何作用.这是一个例子:

<httpErrors errorMode="Detailed" defaultResponseMode="Redirect">
  <clear/>
  <error statusCode="404" path="/error/notfound"/>
</httpErrors>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢Ben

custom-error-pages iis-7.5 iis-express

14
推荐指数
1
解决办法
1万
查看次数

Json.NET序列化私有成员而不是只读属性

如何自定义Json.NET以序列化私有成员而不是序列化公共只读属性(不使用属性).

我创造了一个习惯,IContractResolver但我有点失落.

c# json.net

14
推荐指数
1
解决办法
1万
查看次数

单击超链接时阻止触发父容器单击事件

在我的网页上,我有一个文件列表.

每个文件都在它自己的容器div中(div class ="file").容器内部是文件和描述的链接.

我想允许用户单击容器上的任何位置来下载文件.我通过向容器添加click事件并检索子链接的href来完成此操作.

当文件在新窗口中打开时,如果用户实际单击该链接,则该文件将打开两次.

因此,我需要在单击超链接时阻止触发父容器单击事件.这样做的最佳方法是将超链接功能添加到超链接to0并设置event.stopPropagation吗?据推测,这将阻止事件冒泡到集装箱.

谢谢Ben

javascript javascript-events

13
推荐指数
2
解决办法
3万
查看次数

使用命令模式时的依赖注入

我第一次使用命令模式.我有点不确定我应该如何处理依赖项.

在下面的代码中,我们调度一个CreateProductCommand然后排队等待稍后执行的代码.该命令封装了执行所需的所有信息.

在这种情况下,我们可能需要访问某种类型的数据存储来创建产品.我的问题是,如何将此依赖项注入命令以便它可以执行?

public interface ICommand {
    void Execute();
}

public class CreateProductCommand : ICommand {
    private string productName;

    public CreateProductCommand(string productName) {
        this.ProductName = productName;
    }

    public void Execute() {
        // save product
    }
}

public class Dispatcher {
    public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand {
        // save command to queue
    }
}

public class CommandInvoker {
    public void Run() {

        // get queue

        while (true) {
            var command = queue.Dequeue<ICommand>();
            command.Execute();
            Thread.Sleep(10000);
        }
    } …
Run Code Online (Sandbox Code Playgroud)

.net dependency-injection command-pattern

13
推荐指数
1
解决办法
3865
查看次数

asp.net mvc动作的奇怪行为过滤了AttributeUsage

我有一个带有以下签名的动作过滤器

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

AllowMultiple属性指示属性的多个实例是否可以存在于元素上.如果设置为true,则允许多个实例; 如果设置为false(默认值),则只允许一个实例.

在MVC中,行为似乎有点奇怪.当我用这个属性修饰一个动作时,我发现OnActionExecuting过滤器的方法被执行了两次.

过滤器仅在操作上声明,而不是在控制器上声明,并且我已清除任何全局过滤器.有人可以解释这种行为吗?

asp.net-mvc asp.net-mvc-3

13
推荐指数
1
解决办法
4019
查看次数