4
votes

I am just getting my feet wet with MVC 6. I installed VS 2015 and with the default ASP.NET 5 preview MVC Web Application template everything runs fine under local IIS.

I then tried to switch out the Default DI container with StructureMap following these instructions exactly (note it is a very recent article). The only thing is I had to figure out the namespaces to import myself (since the author neglected to include them) and this is what I included.

I put the StructureMapRegistration class and all related classes into a single file, and here are the usings.

using Microsoft.Framework.DependencyInjection;
using StructureMap;
using StructureMap.Configuration.DSL.Expressions;

I added the following usings to the Startup.cs file.

using StructureMap;
using StructureMap.Graph;
using System.Reflection;

And I made the following edit to the Startup.cs file.

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add Entity Framework services to the services container.
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

    // Add Identity services to the services container.
    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    // Configure the options for the authentication middleware.
    // You can add options for Google, Twitter and other middleware as shown below.
    // For more information see http://go.microsoft.com/fwlink/?LinkID=532715
    services.Configure<FacebookAuthenticationOptions>(options =>
    {
        options.AppId = Configuration["Authentication:Facebook:AppId"];
        options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
    });

    services.Configure<MicrosoftAccountAuthenticationOptions>(options =>
    {
        options.ClientId = Configuration["Authentication:MicrosoftAccount:ClientId"];
        options.ClientSecret = Configuration["Authentication:MicrosoftAccount:ClientSecret"];
    });

    // Add MVC services to the services container.
    services.AddMvc();

    //// Uncomment the following line to add Web API services which makes it easier to port Web API 2 controllers.
    //// You will also need to add the Microsoft.AspNet.Mvc.WebApiCompatShim package to the 'dependencies' section of project.json.
    //// services.AddWebApiConventions();

    //// Register application services.
    //services.AddTransient<IEmailSender, AuthMessageSender>();
    //services.AddTransient<ISmsSender, AuthMessageSender>();

    var container = new Container();
    container.Configure(x =>
    {
        x.Scan(scanning =>
        {
            scanning.Assembly(Assembly.GetExecutingAssembly());
            scanning.TheCallingAssembly();
            scanning.WithDefaultConventions();
        });

        //x.AddRegistry<WebsiteRegistry>();
    });

    // Our framework extension point
    container.Populate(services);
}

Literally, the only things I have changed from the default template are the above code changes and installing StructureMap 3.1.6.186.

The using statements suppress all of the design time compilation errors, but when I build, I get several other errors.

Error CS0012 The type 'Action<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 32

Error CS0012 The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 32

Error CS0012 The type 'Func<,>' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 59

Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 59

Error CS0012 The type 'Type' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 63

Error CS0012 The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 63

Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 63

Error CS0012 The type 'Type' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 67

Error CS0012 The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 67

Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 67

Error CS0012 The type 'Type' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 89

Error CS0012 The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 89

Error CS0411 The type arguments for method 'IContainer.GetInstance(string)' cannot be inferred from the usage. Try specifying the type arguments explicitly. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 89

Error CS0012 The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 107

Error CS0012 The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 107

Error CS0012 The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 120

Error CS1061 'IContainer' does not contain a definition for 'Dispose' and no extension method 'Dispose' accepting a first argument of type 'IContainer' could be found (are you missing a using directive or an assembly reference?) TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Services\StructureMapRegistration.cs 120

Error CS0012 The type 'Action<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Startup.cs 94

Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Startup.cs 94

Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Startup.cs 107

Error CS0012 The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Startup.cs 107

Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. TestDI3.DNX Core 5.0 f:\Users\Shad\documents\visual studio 2015\Projects\TestDI3\src\TestDI3\Startup.cs 107

The error indicates where the problem is - I need a reference to mscorlib 2.0.5.0. But I am already referencing mscorlib 4.0.0.0 in the project.

At this point in ASP.NET < 5, the next step would typically be to add some binding redirects to the <bindingRedirect> section of the web.config file. However, after searching for how to do this in ASP.NET 5, I came across this answer which indicates that binding redirection is supposed to be "totally automatic".

So is this a bug, or is there some step in my configuration that I missed that is resulting in this error?

Configuration

DNX 1.0.0-beta5

.NET Framework

x86

IIS Express

project.json

{
    "webroot": "wwwroot",
    "userSecretsId": "aspnet5-TestDI3-1665343b-5aa5-4d08-8596-a1a536223a19",
    "version": "1.0.0-*",

    "dependencies": {
        "EntityFramework.SqlServer": "7.0.0-beta5",
        "EntityFramework.Commands": "7.0.0-beta5",
        "Microsoft.AspNet.Mvc": "6.0.0-beta5",
        "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta5",
        "Microsoft.AspNet.Authentication.Cookies": "1.0.0-beta5",
        "Microsoft.AspNet.Authentication.Facebook": "1.0.0-beta5",
        "Microsoft.AspNet.Authentication.Google": "1.0.0-beta5",
        "Microsoft.AspNet.Authentication.MicrosoftAccount": "1.0.0-beta5",
        "Microsoft.AspNet.Authentication.Twitter": "1.0.0-beta5",
        "Microsoft.AspNet.Diagnostics": "1.0.0-beta5",
        "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-beta5",
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-beta5",
        "Microsoft.AspNet.Server.IIS": "1.0.0-beta5",
        "Microsoft.AspNet.Server.WebListener": "1.0.0-beta5",
        "Microsoft.AspNet.StaticFiles": "1.0.0-beta5",
        "Microsoft.AspNet.Tooling.Razor": "1.0.0-beta5",
        "Microsoft.Framework.Configuration.Abstractions": "1.0.0-beta5",
        "Microsoft.Framework.Configuration.Json": "1.0.0-beta5",
        "Microsoft.Framework.Configuration.UserSecrets": "1.0.0-beta5",
        "Microsoft.Framework.Logging": "1.0.0-beta5",
        "Microsoft.Framework.Logging.Console": "1.0.0-beta5",
        "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta5",
        "structuremap": "3.1.6.186"
    },

    "commands": {
        "web": "Microsoft.AspNet.Hosting --config hosting.ini",
        "ef": "EntityFramework.Commands"
    },

    "frameworks": {
        "dnx451": { },
        "dnxcore50": { }
    },

    "exclude": [
        "wwwroot",
        "node_modules",
        "bower_components"
    ],
    "publishExclude": [
        "node_modules",
        "bower_components",
        "**.xproj",
        "**.user",
        "**.vspscc"
    ],
    "scripts": {
        "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
    }
}
1
What's your project.json look like and is this happening in IIS Express or IIS?Dealdiane
@opiants - added to my answer. I have changed nothing from the default template except for the above code changes and adding StructureMap 3.1.6.186 as a dependency. The project doesn't even compile so I am pretty certain this has nothing to do with IIS Express.NightOwl888
Have no experience with StructureMap itself but could it be that it doesn't support .NET Core yet? Even early-adopter DI containers are still in its very early stages. Anyway, try removing dnxcore50 in your frameworks in projects.json and see if it compiles or maybe try this nuget package instead or try both.Dealdiane

1 Answers

3
votes

Thanks to opiants, the problem appears to be related to the fact that the dnxcore50 framework was included in the project.

"frameworks": {
    "dnx451": { },
    "dnxcore50": { }
}

Removing it solved the issue.

"frameworks": {
    "dnx451": { }
}