2015-10-20 25 views
5

Tôi đang làm việc trên một trang web thương mại điện tử sử dụng Asp.Net 5 và MVC6 sau Kiến trúc Onion (OA) để chúng ta có khớp nối lỏng lẻo giữa các lớp. Tôi cũng muốn decouple Startup code trong hội đồng của riêng mình thay vì có nó trong dự án MVC.Asp.Net 5 MVC 6 Startup.cs Phân tách hội trong Beta8

Trong bản beta7 Rất dễ di chuyển Startup.cs vào thư viện lớp (Bootstrapper) như được giải thích here. Một thực tế thú vị bằng cách sử dụng cách tiếp cận được đề cập là tôi không phải tham khảo assembly Bootstrapper từ dự án MVC. Khi chạy, lưu trữ dưới IISExpress, thông qua quá trình quét hội đồng, nó có thể tìm thấy hội đồng Bootstrapper được đề cập trong tệp Microsoft.AspNet.Hosting.ini. Đây là có thể bằng cách xác định vị trí trong global.json

{ 
    "projects": [ "Source/Projects","Source/Bootstrapper" ], 
    "sdk": { 
     "architecture": "x64", 
     "runtime": "clr", 
     "version": "1.0.0-beta7" 
    } 
} 

Dự án Bootstrapper sẽ có tài liệu tham khảo cho tất cả các dự án khác như cơ sở hạ tầng, dịch vụ vv để treo lên Dependency Injection.

Lý do không tham chiếu dự án Bootstrapper trong dự án MVC, tuân theo quy tắc Kiến trúc Onion, là tránh truy cập vào mã cơ sở hạ tầng trực tiếp từ dự án MVC. Vì vậy, đây là tất cả làm việc tốt cho đến khi tôi nâng cấp lên Beta8 sáng nay.

Như mô hình lưu trữ được thay đổi từ IIS để Kestrel, tôi phải cấu trúc lại các tập tin global.json và project.json như sau

global.json

{ 
    "projects": [ "Source/Projects","Source/Bootstrapper" ], 
    "sdk": { 
     "architecture": "x64", 
     "runtime": "clr", 
     "version": "1.0.0-beta8" 
    } 
} 

project.json

{ 
    "dependencies": { 
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-beta8", 
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-beta8", 
    "....", 
    "....", 
}, 

"commands": { 
    "web": "Microsoft.AspNet.Server.Kestrel" 
    } 
} 

Sau khi thực hiện các thay đổi ở trên, tôi bắt đầu nhận được lỗi sau bất kể tôi chạy nó sử dụng lệnh DNX hoặc trực tiếp thông qua Visual Studio

Internal Server Error System.InvalidOperationException Một loại tên 'StartupDevelopment' hoặc 'Khởi động' không thể được tìm thấy trong lắp ráp 'EcommerceMvcApp'. tại Microsoft.AspNet.Hosting.Startup.StartupLoader.FindStartupType (String startupAssemblyName, IList diagnosticMessages) tại Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureStartup() tại Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureApplicationServices () tại Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplication()

Hóa ra rằng tôi có để xác định tập tin cấu hình hoặc tranh cãi inline để lệnh web như được giải thích here. Sau khi làm theo các gợi ý, tôi đã cố gắng chạy ứng dụng và thời gian này, tôi bắt đầu nhận được các lỗi dưới đây

System.IO.FileNotFoundException Không thể tải tập tin hoặc lắp ráp 'Bootstrapper' hoặc một trong các phụ thuộc của nó. Hệ thống không thể tìm thấy tệp được chỉ định. tại System.Reflection.RuntimeAssembly._nLoad (AssemblyName fileName, String codebase, Bằng chứng assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) tại System.Reflection.RuntimeAssembly.nLoad (AssemblyName fileName, String codebase , Bằng chứng assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) tại System.Reflection.RuntimeAssembly.InternalLoadAssemblyName (AssemblyName assemblyRef, Bằng chứng assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) tại System.Reflection.Assembly.Load (AssemblyName assemblyRef) tại Microsoft.AspNet.Hosting.Startup .StartupLoader.FindStartupType (string startupAssemblyName, IList diagnosticMessages) tại Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureStartup() tại Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureApplicationServices() tại Microsoft.AspNet.Hosting. Internal.HostingEngine.BuildApplication()

solution yêu cầu tôi thêm tham chiếu vào dự án Bootstrapper trong dự án MVC và nó hoạt động. Tuy nhiên, nó đánh bại mục đích có một hội đồng Bootstrapper riêng biệt ngay từ đầu.

Câu hỏi đặt ra là tại sao nó không thể tìm thấy tổ hợp Bootstrapper như được sử dụng trong Beta7, sử dụng các nguồn được chỉ định trong "dự án" trong global.json hoặc là mô hình lưu trữ mới bỏ qua global.json? Có cách nào để xác định vị trí của hội đồng khởi động?

Cập nhật 1

Chỉ muốn nhấn mạnh rằng trong Beta7 nó cũng làm việc sử dụng "lệnh DNX" cho cả hai Microsoft.AspNet.Server.WebListener và Microsoft.AspNet.Server.Kestrel.

"commands": { 
     "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5004 --config wwwroot/Microsoft.AspNet.Hosting.ini", 
     "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5004 --config wwwroot/Microsoft.AspNet.Hosting.ini" 
    } 

Tuy nhiên, lệnh dnx (sử dụng tệp Microsoft.AspNet.Hosting.json) không thành công cho cả hai máy chủ trong Beta8. Nếu ai đó đang tự hỏi rằng đó là một cái gì đó để làm với thành phần IIS Helios trong Beta7, nó không phải là trường hợp. Tôi đang bối rối như tại sao tra cứu lắp ráp ngừng làm việc trong beta8

Cập nhật 2

Đây là vết đống mà tôi nhận được khi tôi cố gắng chạy trong beta8 sử dụng IISExpress. Dường như nó đang cố gắng để tìm lắp ráp trong thư mục bin dnx.

System.IO.FileNotFoundException: Không thể tải tệp hoặc lắp ráp 'Bootstrapper' hoặc một trong các phụ thuộc của nó. Hệ thống không thể tìm thấy tệp được chỉ định. Tên tệp: 'Bootstrapper' tại System.Reflection.RuntimeAssembly._nLoad (AssemblyName fileName, String codebase, Bằng chứng assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) tại System.Reflection.RuntimeAssembly.nLoad (AssemblyName fileName, String codebase , Bằng chứng assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) tại System.Reflection.RuntimeAssembly.InternalLoadAssemblyName (AssemblyName assemblyRef, Bằng chứng assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark & stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) tại System.Reflection.Assembly.Load (AssemblyName assemblyRef) tại Microsoft.AspNet.Hosting.Startup .StartupLoader.FindStartupType (string startupAssemblyName, IList`1 diagnosticMessages) tại Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureStartup() tại Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureApplicationServices() tại Microsoft.AspNet. Hosting.Internal.HostingEngine.BuildApplication()

=== Thông tin trạng thái liên kết trước === LOG: DisplayName = Bootstrapper (một phần) WRN: Thông tin liên kết một phần được cung cấp cho một assembly : WRN: Tên lắp ráp: Bootstrapper | ID tên miền: 1 WRN: A liên kết một phần xảy ra khi chỉ một phần tên hiển thị lắp ráp là được cung cấp. WRN: Điều này có thể dẫn đến việc chất kết dính tải lắp ráp không chính xác. WRN: Chúng tôi khuyên bạn nên cung cấp thông tin nhận dạng văn bản đầy đủ được chỉ định cho hội đồng, WRN: bao gồm tên đơn giản, phiên bản, văn hóa và mã thông báo khóa công cộng. WRN: Xem báo cáo chính thức http://go.microsoft.com/fwlink/?LinkId=109270 để biết thêm thông tin và các giải pháp phổ biến cho vấn đề này. LOG: Appbase = tệp: /// C: /Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/ LOG: Initial PrivatePath = NULL Gọi điện thoại: (Không xác định). === LOG: Ràng buộc này bắt đầu trong ngữ cảnh tải mặc định. LOG: Không tìm thấy tệp cấu hình ứng dụng nào. LOG: Sử dụng tệp cấu hình máy chủ lưu trữ: LOG: Sử dụng tệp cấu hình máy từ C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config. LOG: Chính sách không được áp dụng cho tham chiếu tại thời điểm này (riêng tư, liên kết lắp ráp tùy chỉnh, một phần hoặc dựa trên vị trí). LOG: Đang cố gắng tải xuống URL mới tệp: /// C: /Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper.DLL. LOG: Đang cố tải xuống URL mới tệp: /// C: /Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper/Bootstrapper.DLL. LOG: Đang cố tải xuống URL mới tệp: /// C: /Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper.EXE. LOG: Đang cố tải xuống URL mới tệp: /// C: /Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper/Bootstrapper.EXE.

Có lẽ, nếu tôi chạy DNU xuất bản và lưu trữ nó dưới IIS nó sẽ làm việc, nhưng điều đó có nghĩa là tôi sẽ phải phát hành nó mỗi khi tôi thực hiện thay đổi

+0

Bạn thực sự nên thực hiện điều này với [kho lưu trữ aspnet/Home] (https://github.com/aspnet/Home/) ans yêu cầu hỗ trợ tại đó. – poke

+0

Bạn có thể đạt được nó? Bây giờ RC1 đã được phát hành, có lẽ nó dễ dàng hơn. – Franco

+0

Tôi chưa thử. Tôi nghĩ rằng với điểm vào mới trong tập tin khởi động tức là phương pháp chính nó có thể là có thể. Tôi sẽ cung cấp cho nó một đi –

Trả lời

0

Các lưu trữ định dạng tập tin cấu hình đã thay đổi từ INI với Json.Hãy thử điều này:

{ 
    "Hosting:Application": "Bootstrapper", 
} 

Cũng xem this issue.

+1

Có, tôi đã sử dụng tệp hosting.json. Vấn đề không phải là tệp lưu trữ. Thông báo lỗi thứ hai trong câu hỏi của tôi cho biết rằng nó đang tìm kiếm một hội đồng Bootstrapper. Tuy nhiên, nó không thể tìm thấy nó –

1

Tôi bị kẹt trong một vấn đề tương tự. Có vẻ như chúng tôi không muốn tham chiếu từ lớp giao diện người dùng đến lớp Infraestructure (chúng tôi rất hạn chế), thậm chí không làm cho độ phân giải phụ thuộc.

Có thể bằng cách sử dụng cuối ràng buộc (Tôi vừa nghe nói về nó), nhưng tôi nghĩ rằng bạn nên đọc this article. Về cơ bản nó nói rằng một Root Root không thể tái sử dụng được, và phải có một cho mỗi ứng dụng (ví dụ, một cho UI.Web, một cho UI.Console, và như vậy).

Điều đó cũng trả lời câu hỏi của tôi về những gì có độ phân giải DI trong UI.Web, nhưng cần một giao diện người dùng khác, hãy nói Console (câu trả lời: nó thích hợp hơn để làm cho độ phân giải anoter DI trong Console và nó sẽ có độ phân giải riêng phụ thuộc liên quan đến cách ứng dụng Console thực sự hoạt động như thế nào).

Tôi hy vọng sẽ cung cấp cho bạn một điểm tốt để làm rõ vấn đề này.

+0

Cảm ơn Franco. 1 để đề cập đến bài viết tuyệt vời. Tôi đã đọc một bài báo [http://blog.ploeh.dk/2011/07/28/CompositionRoot/) cách đây một lúc, bởi cùng một anh chàng, về cùng một chủ đề và kể từ đó tôi làm theo quy tắc tức là làm cho CR càng gần điểm vào càng tốt. Tôi hoàn toàn đồng ý với Mak và ba ứng dụng trong giải pháp của tôi có CR riêng của họ. Tuy nhiên, vấn đề của tôi không tái sử dụng CR, nhưng tách nó ra khỏi điểm vào của ứng dụng. Điều này sẽ làm cho lớp UI độc lập với vùng chứa DI và các phụ thuộc tạm thời giữa lớp UI, Infrastructure và Services. –

+0

Pre Asp.Net 5, tách một CR dễ dàng đạt được bằng cách sử dụng cấp độ lắp ráp [PreApplicationStartMethod] (http://haacked.com/archive/2010/05/16/three-hidden-extensibility-gems-in-asp -net-4.aspx /) thuộc tính. Nó cũng đã được làm việc trong Beta7 nhưng tôi hỏi câu hỏi tại GitHub là tốt và theo David Fowler nó làm việc vì lỗi trong phiên bản beta7. Xem câu hỏi [tại đây] (https://github.com/aspnet/Hosting/issues/433#issuecomment-150122556). Có lẽ, như David đề nghị tôi sẽ cần phải viết một bộ nạp lắp ráp tùy chỉnh. Tuy nhiên, tính năng này có thể đã được cung cấp bằng cách chuyển các đối số cho dnx –

+0

Vâng, tôi hiểu ý của bạn. Tuy nhiên, bây giờ tôi không tìm thấy giá trị trong cố gắng decouple những điều như vậy. Tôi chỉ đơn giản có thể nói rằng độ phân giải phụ thuộc của tôi ** biết ** về tất cả các lớp của tôi (UI, Dịch vụ và Infraestructure). Điều đó có nghĩa là ứng dụng của tôi được dán trong giao diện người dùng, ứng dụng thực tế và cơ chế kiên trì của nó có thể khác với một ứng dụng Console. Nếu nó sẽ giống nhau, tôi sẽ viết lại DI, nhưng khác đi. Tôi không biết nếu tôi có thể truyền cho bạn điểm – Franco

Các vấn đề liên quan