ASp.net vnext中的AssemblyNeutral属性

网步

我最近遇到AssemblyNeutral了ASP.net vnext的属性。

如果需要具体说明,那么您将在“日志记录”存储库中找到该属性的用法。https://github.com/aspnet/logging

还有许多其他存储库,但这很简单。

现在,根据许多博客,如果我们使用AssemblyNeutral属性,那么该接口或类型不与程序集绑定,因此我们可以AssemblyNeutral在其他需要相同合同的框架中定义具有属性的相同接口

因此,创建示例我在ASP.net vnext类库项目中创建了自己的小型记录器库,但是它给我造成类型转换错误。

 namespace MyLogger
{
    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public interface ILogger
    {      
        void Write(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter);
        bool IsEnabled(LogLevel logLevel);
        IDisposable BeginScope(object state);
    }

    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public interface ILoggerFactory
    {       
        ILogger Create(string name);
        void AddProvider(ILoggerProvider provider);
    }
    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public interface ILoggerProvider
    {        
        ILogger Create(string name);
    }

    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public enum LogLevel
    {
        Verbose = 1,
        Information = 2,
        Warning = 3,
        Error = 4,
        Critical = 5,
    }

    public class MyLogger : ILogger
    {
        public IDisposable BeginScope(object state)
        {
            return null;  
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Write(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
        {
            System.IO.File.AppendAllText("C:\\Testlog.txt", "This is test log" + System.Environment.NewLine);
        }
    }

    public class MyLoggerProvider : ILoggerProvider
    {
        private readonly Func<string, LogLevel, bool> _filter;

        public MyLoggerProvider(Func<string, LogLevel, bool> filter)
        {
            _filter = filter;
        }

        public ILogger Create(string name)
        {
            return new MyLogger();
        }       
    }

    public static class MyLoggerExtentions
    {
        public static ILoggerFactory AddMyLogger(this ILoggerFactory factory, Func<string, LogLevel, bool> filter)
        {
            factory.AddProvider(new MyLoggerProvider(filter));
            return factory;
        }
    }
}

现在,我尝试在SampleApp(日志存储库SampleApp)中使用。您可以看到它给了我投射错误。为什么这样 ?

在此处输入图片说明

网步

我部分同意Visual Studio 2015预览版IDE不支持AssemlbyNeutral属性,但问题出在其他地方。

实际上,当我们在自定义程序集中再次定义Interface或Type时,如果我们希望它支持AssemblyNeutral,则它必须具有与原始接口相同的名称空间。

在我的示例中,我通过将接口放在New Namespace中来做错了。

我已经更新了代码,然后在Visual Studio 2015预览版中构建它可以编译甚至正确执行。

因此,要记住的主要事情是“在与原始装配相同的名称空间中放置装配中立接口和类型”。

以下是更新的代码。

namespace Microsoft.Framework.Logging
{
    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public interface ILogger
    {
        void Write(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter);
        bool IsEnabled(LogLevel logLevel);
        IDisposable BeginScope(object state);
    }

    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public interface ILoggerFactory
    {
        ILogger Create(string name);
        void AddProvider(ILoggerProvider provider);
    }

    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public interface ILoggerProvider
    {
        ILogger Create(string name);
    }

    #if ASPNET50 || ASPNETCORE50
    [Microsoft.Framework.Runtime.AssemblyNeutral]
    #endif
    public enum LogLevel
    {
        Verbose = 1,
        Information = 2,
        Warning = 3,
        Error = 4,
        Critical = 5,
    }
}

namespace MyLogger
{


    public class MyLogger : ILogger
    {
        public IDisposable BeginScope(object state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Write(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
        {
            System.IO.File.AppendAllText("C:\\Testlog.txt", "This is test log" + System.Environment.NewLine);
        }
    }

    public class MyLoggerProvider : ILoggerProvider
    {
        private readonly Func<string, LogLevel, bool> _filter;

        public MyLoggerProvider(Func<string, LogLevel, bool> filter)
        {
            _filter = filter;
        }

        public ILogger Create(string name)
        {
            return new MyLogger();
        }
    }

    public static class MyLoggerExtentions
    {
        public static ILoggerFactory AddMyLogger(this ILoggerFactory factory, Func<string, LogLevel, bool> filter)
        {
            factory.AddProvider(new MyLoggerProvider(filter));
            return factory;
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASp.net vnext中的AssemblyNeutral属性

来自分类Dev

什么是asp.net vnext中的wwwroot

来自分类Dev

在ASP.NET vNext中替换HttpHandlers

来自分类Dev

ASP.NET dotnet框架中缺少System.Net.Sockets?-ASP.NET vNext

来自分类Dev

ASP .Net VNext和Owin

来自分类Dev

什么是ASP.NET vNext?

来自分类Dev

Asp.net vNext中的Thread.Sleep

来自分类Dev

增加最大 在asp.net 5(vNext)中的请求长度

来自分类Dev

在ASP.NET 5(vNext)中获取配置值

来自分类Dev

在asp.net vnext中获取应用程序路径

来自分类Dev

ASP.NET 5(vNext)中的身份验证

来自分类Dev

在ASP.NET vNext筛选器中获取注入的对象

来自分类Dev

与ASP.net vNext中的非托管代码互操作

来自分类Dev

在ASP.NET vNext中获取当前的MethodBase

来自分类Dev

WebAPI One Asp.Net(ASP5 / vNext)中的分页

来自分类Dev

ASP.NET Core中的属性

来自分类Dev

ASP.NET中的调试属性路由

来自分类Dev

在asp.net属性中访问数据

来自分类Dev

ASP.NET Core中的属性注入

来自分类Dev

更改ASP.NET中的默认属性

来自分类Dev

在asp.net属性中访问数据

来自分类Dev

ASP.NET Core中的属性

来自分类Dev

用于dnx核心5.0的asp.net vnext中的System.Net.WebClient

来自分类Dev

无法在asp.net vnext类库中使用必需的属性

来自分类Dev

ASP.net vnext依赖项注入

来自分类Dev

ASP.NET vNext项目参考

来自分类Dev

什么是asp.net vNext功能?

来自分类Dev

使用ASP.Net vNext发送邮件

来自分类Dev

vnext(asp .net 5.0)和oracle