Vì vậy, tôi phải lấy Assembly từ một dll được tham chiếu.
Trong thế giới asp.NET MVC / WebAPI, sẽ luôn có ít nhất một lớp kế thừa từ đó System.Web.HttpWebApplication
. Việc triển khai bên dưới tìm kiếm lớp đó.
using System;
using System.Linq;
static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
Ở trên sử dụng System.Linq
để tìm mối quan hệ đó, nhưng điều này cũng có thể được thực hiện mà không có.
Đầu tiên, chúng tôi nhận được tất cả các cụm đã tải
AppDomain.CurrentDomain.GetAssemblies()
Sau đó, liệt kê thông qua IEnumerable<Assembly>
và lấy tất cả các loại nằm trực tiếp trong assembly.
a.GetExportedTypes()
Sau đó, hãy xem liệu có bất kỳ kiểu nào kế thừa từ System.Web.HttpWebApplication
t.BaseType?.FullName == "System.Web.HttpApplication"
Trong quá trình triển khai của mình, tôi đã đảm bảo rằng mã này sẽ chỉ được gọi một lần, nhưng nếu điều đó không được đảm bảo, tôi rất muốn gói nó trong một Lazy<T>
hoặc triển khai tải chậm được lưu trong bộ nhớ cache vì sẽ khá tốn kém khi tiếp tục thực hiện tìm kiếm mù.
using System;
using System.Linq;
// original method
private static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
// lazy load implementation
private static Lazy<Assembly> _webAssembly = new Lazy<Assembly>(GetWebAssembly);
public static Assembly WebAssembly { get => _webAssembly.Value; }